2015-07-06 6 views
1

У меня есть настройка проекта веб-API nodejs/expressjs, которая отлично работает, когда я тестирую ее с помощью curl.iisnode и cors на лазурных веб-сайтах

Вот выход для местного вызова:

dc-designer-client git:(master) curl -H "Origin: http://example.com" -H "Access-Control-Request-Method: GET" -H "Access-Control-Request-Headers: X-Requested-With" -X OPTIONS --verbose http://0.0.0.0:3000/api/grid 
* Hostname was NOT found in DNS cache 
* Trying 0.0.0.0... 
* Connected to 0.0.0.0 (127.0.0.1) port 3000 (#0) 
> OPTIONS /api/grid HTTP/1.1 
> User-Agent: curl/7.37.1 
> Host: 0.0.0.0:3000 
> Accept: */* 
> Origin: http://example.com 
> Access-Control-Request-Method: GET 
> Access-Control-Request-Headers: X-Requested-With 
> 
< HTTP/1.1 200 OK 
< X-Powered-By: Express 
< Access-Control-Allow-Origin: * 
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS 
< Access-Control-Allow-Headers: Content-Type, Authorization, Content-Length, X-Requested-With, * 
< Content-Type: text/plain; charset=utf-8 
< Content-Length: 2 
< ETag: W/"2-4KoCHiHd29bYzs7HHpz1ZA" 
< Date: Mon, 06 Jul 2015 01:24:01 GMT 
< Connection: keep-alive 
< 
* Connection #0 to host 0.0.0.0 left intact 

Однако, когда я раскрываю в лазурных и попробуйте запустить тот же завиток заявление, он дает мне следующее:

dc-designer-server git:(master) curl -H "Origin: http://example.com" -H "Access-Control-Request-Method: GET" -H "Access-Control-Request-Headers: X-Requested-With" -X OPTIONS --verbose http://dc-server.azurewebsites.net/api/grid 
* Hostname was NOT found in DNS cache 
* Trying 23.96.124.25... 
* Connected to dc-server.azurewebsites.net (127.0.0.1) port 80 (#0) 
> OPTIONS /api/grid HTTP/1.1 
> User-Agent: curl/7.37.1 
> Host: dc-server.azurewebsites.net 
> Accept: */* 
> Origin: http://example.com 
> Access-Control-Request-Method: GET 
> Access-Control-Request-Headers: X-Requested-With 
> 
* Empty reply from server 
* Connection #0 to host dc-server.azurewebsites.net left intact 
curl: (52) Empty reply from server 

Я уверен, это связано с iisnode и iis на лазури. Я не знаю, как настроить Azure WebSite, чтобы позволить проверке предполета OPTIONS пройти через nodejs.

В моем коде server.js используется пакет npm cors. Этот код работает локально, когда я настраиваю nodejs и выражаю, но кажется, что IIS на Azure блокирует или вызывает проблемы с моим кодом.

Кто-нибудь настроил Azure WebSites, используя iisnode, чтобы разрешать вызовы CORS?

+0

Вы пробовали посмотреть этот пост? http://stackoverflow.com/questions/18981339/http-options-request-on-azure-websites-fails-due-to-cors. Он использует PHP, но изменение заголовков в файле web.config должно иметь тот же эффект. –

ответ

0

Оказывается, вам не нужно изменять веб-сайт по умолчанию.config для Azure IISNode для обработки запросов CORS.

В моем коде server.js NodeJS я использую стандартный пакет CORS npm. Что мне пришлось изменить, чтобы заставить мои запросы CORS работать в браузерах, это изменить протокол для моих запросов с «HTTP» на «HTTPS».

Как только это изменение было сделано, я смог использовать любой браузер, а также проверить свой WebAPI с помощью curl.

+0

не ставьте эту информацию как ответ, вы можете добавить эту информацию изменить свой вопрос – oriaj

-1

Существует образец here, который устанавливает как передний, так и задний конец сайта и настраивается с помощью CORS. В частности, у this file есть логика.

Это, как говорится, это образец .NET. Таким образом, он показывает, что он может работать в Azure Web Apps в целом, но я не уверен, есть ли особые соображения, связанные с IISNode.

+2

Спасибо, Дэвид, есть ли у вас какие-то примеры с IISNode и CORS? Я использую пакет CORS npm, и я знаю, что он работает за пределами Azure. Я действительно думаю, что IIS блокирует или не отправляет запрос CORS в NodeJS. Любая помощь в этом конкретном сценарии была бы весьма признательна. – mattduffield

1

Я использую nodejs на сайтах Azure. Я установил пакет cors и включил запросы от всех доменов. Azure все еще блокировал запрос CORS.

Я изменил web.config (на каждом сайте есть один, если он не является частью развертывания, затем он создается). За этой StackOverflow должность: HTTP OPTIONS request on Azure Websites fails due to CORS

Моей полной web.config ниже - Есть настройки специфичны для моего сайта, поэтому копирование и вставка не будет работать.

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    This configuration file is required if iisnode is used to run node processes behind 
    IIS or IIS Express. For more information, visit: 

    https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config 
--> 

<configuration> 
    <system.webServer> 
    <!-- Visit http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx for more information on WebSocket support --> 
    <webSocket enabled="false" /> 
    <handlers> 
     <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module --> 
     <add name="iisnode" path="transpiled/www.js" verb="*" modules="iisnode"/> 
    </handlers> 
    <rewrite> 
     <rules> 
     <!-- Do not interfere with requests for node-inspector debugging --> 
     <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true"> 
      <match url="^transpiled/www.js\/debug[\/]?" /> 
     </rule> 

     <!-- First we consider whether the incoming URL matches a physical file in the /public folder --> 
     <rule name="StaticContent"> 
      <action type="Rewrite" url="public{REQUEST_URI}"/> 
     </rule> 

     <!-- All other URLs are mapped to the node.js site entry point --> 
     <rule name="DynamicContent"> 
      <conditions> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/> 
      </conditions> 
      <action type="Rewrite" url="transpiled/www.js"/> 
     </rule> 
     </rules> 
    </rewrite> 

    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it --> 
    <security> 
     <requestFiltering> 
     <hiddenSegments> 
      <remove segment="bin"/> 
     </hiddenSegments> 
     </requestFiltering> 
    </security> 

    <!-- Make sure error responses are left untouched --> 
    <httpErrors existingResponse="PassThrough" /> 

    <!-- 
     You can control how Node is hosted within IIS using the following options: 
     * watchedFiles: semi-colon separated list of files that will be watched for changes to restart the server 
     * node_env: will be propagated to node as NODE_ENV environment variable 
     * debuggingEnabled - controls whether the built-in debugger is enabled 

     See https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config for a full list of options 
    --> 
    <!--<iisnode watchedFiles="web.config;*.js"/>--> 

    <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" /> 
      <add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" /> 
      <add name="Access-Control-Expose-Headers" value="X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" /> 
     </customHeaders> 
    </httpProtocol> 

    </system.webServer> 
</configuration> 

Скопируйте этот раздел и вставить его прямо над закрытия system.webServer тега.

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Olaround-Debug-Mode, Authorization, Accept" /> 
     <add name="Access-Control-Expose-Headers" value="X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" /> 
    </customHeaders> 
</httpProtocol> 

Чтобы получить web.config, вам придется развернуть, а затем FTP в экземпляр. Вы можете сделать это, нажав ссылку «Загрузить ссылку публикации» на панели инструментов сайта.

Открыть файл вверх, это xml.

<?xml version="1.0"?> 
<publishData> 
    <publishProfile profileName="secret - Web Deploy" publishMethod="MSDeploy" publishUrl="secret.scm.azurewebsites.net:443" msdeploySite="secret" userName="$secret" userPWD="v0ifRuLpeXf42kurCFHqXSA5uQnAdmx2c7lCHrrQPiyB6TxlXoG0dfJGFndH" destinationAppUrl="http://secret.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="" webSystem="WebSites"> 
    <databases/> 
</publishProfile> 
<publishProfile profileName="secret - FTP" publishMethod="FTP" publishUrl="ftp://secret.ftp.azurewebsites.windows.net/site/wwwroot" ftpPassiveMode="True" userName="secret\$secret" userPWD="secret2c7lCHrrQPiyB6TxlXosecret" destinationAppUrl="http://secret.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="" webSystem="WebSites"> 
<databases/> 
</publishProfile> 
</publishData> 

В элементе publishProfile для FTP вы найдете URL-адрес, имя пользователя и пароль. Используйте значения целиком, иначе это не сработает.

Как только у вас есть web.config, внесите изменения и загрузите его обратно на сайт. Посмотрите, работает ли это. Это было для меня.

Чтобы он продолжал работать, вам нужно добавить web.config в корень проекта (или сайта). В противном случае Azure ударит его при каждом развертывании.

+0

Привет, Чак, я не знаком с заголовками X-Olaround- *. Кроме того, мне нужно что-то делать на консоли управления, чтобы он мог получить изменения в web.config? Наконец, я не использую обычную папку «transpiled», которая будет необходима или подпапка? – mattduffield

+0

Нет, изменения web.config автоматически обнаруживаются. Папка transpile предназначена для моего приложения. Вот почему я предложил вам загрузить файл web.config из вашего экземпляра веб-сайтов Azure. В моем приложении transpile/www.js - это файл javascript для запуска. Вы можете попробовать изменить его, чтобы указать на сценарий запуска. –

+0

Я пробовал раздел customheaders и проверял, что web.config обновлен с моими изменениями. Это все еще не работает? Когда я зависаю, используя заголовок OPTIONS, IIS немедленно отвечает на этот ответ следующим образом: – mattduffield

 Смежные вопросы

  • Нет связанных вопросов^_^