2015-06-09 2 views
1

Я разрабатываю публичный API с помощью Azure API Management, который затем вызывает методы обслуживания в моем облачном сервисе. Чтобы другие приложения могли использовать этот API из среды браузера, мне нужно включить CORS в облачном сервисе. Включение CORS включает обработку запросов OPTIONS, которые отправляются браузером в качестве предполета, чтобы проверить, установлены ли правильные заголовки.Включение метода OPTIONS в Azure Cloud Service (для включения CORS)

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

<system.webServer> 
    <handlers> 
    <remove name="SimpleHandlerFactory-Integrated-4.0" /> 
    <remove name="SimpleHandlerFactory-Integrated" /> 
    <remove name="SimpleHandlerFactory-ISAPI-4.0_64bit" /> 
    <remove name="SimpleHandlerFactory-ISAPI-4.0_32bit" /> 
    <remove name="SimpleHandlerFactory-ISAPI-2.0-64" /> 
    <remove name="SimpleHandlerFactory-ISAPI-2.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="bitness32" /> 
    <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" /> 
    <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" /> 
    <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
    <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv2.0" /> 
    <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    . . . 
</system.webServer> 

Это гарантирует, что OPTIONS вызовы до моего .ashx и SVC-код, в котором Затем я могу установить правильные заголовки.

Все это работает нормально, когда я вызываю службы из другого домена, например, используя js скрипку.

Однако, когда я загружаю свое приложение в Azure, оно больше не работает. Любые запросы OPTIONS возвращают 404 немедленно.

Похоже, что определения обработчиков, используемые для перенаправления запросов OPTIONS к моим приложениям, не работают на Azure.

Мой вопрос: что мне нужно настроить, чтобы убедиться, что запросы OPTIONS доходят до моего приложения и могут обрабатываться там на Azure?

+1

Azure Management API приходит с Корс политики https://msdn.microsoft.com/library/azure/7689d277-8abe-472a-a78c-e6d4bd43455d? F = 255 & MSPPError = -2147217396 # CORS –

ответ

1

В конце концов, я в конечном итоге удаление обработчиков, как в моем вопросе, но добавление двух пользовательских обработчиков:

<remove name="SimpleHandlerFactory-Integrated-4.0" /> 
<remove name="SimpleHandlerFactory-Integrated" /> 
<remove name="SimpleHandlerFactory-ISAPI-4.0_64bit" /> 
<remove name="SimpleHandlerFactory-ISAPI-4.0_32bit" /> 
<remove name="SimpleHandlerFactory-ISAPI-2.0-64" /> 
<remove name="SimpleHandlerFactory-ISAPI-2.0" /> 
<remove name="OPTIONSVerbHandler" /> 
<!-- Added the following handlers --> 
<add name="AshxHandler" path="*.ashx" verb="*" 
    type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" 
    requireAccess="Script"/> 
<add name="SvcHandler" path="*.svc" verb="*" 
    type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" 
    requireAccess="Script"/> 

Другая часть ответа добавлял операции OPTIONS в управлении API. Использование политики управления CORS в API Management, предложенное Мяо Цзяном, на самом деле не сработало и фактически нарушает CORS в моей ситуации, когда я включаю его сейчас. Я уверен, что он будет работать и для других ситуаций.

EDIT: Я все равно использовал политику, и теперь он работает. Операции OPTIONS не нужно добавлять. Я использовал следующую политику на уровне API:

<policies> 
    <inbound> 
     <base /> 
     <cors> 
      <allowed-origins> 
       <origin>*</origin> 
      </allowed-origins> 
      <allowed-methods> 
       <method>GET</method> 
       <method>POST</method> 
       <method>OPTIONS</method> 
      </allowed-methods> 
      <allowed-headers> 
       <header>*</header> 
      </allowed-headers> 
     </cors> 
    </inbound> 
    <outbound> 
     <base /> 
    </outbound> 
</policies> 
Смежные вопросы