Включение метода OPTIONS в облачной службе Azure (для включения CORS)

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

Чтобы убедиться, что запрос 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 fiddle.

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

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

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


person Bart van der Drift    schedule 09.06.2015    source источник
comment
Управление API Azure поставляется с политикой cors msdn.microsoft.com/library/azure/   -  person Miao Jiang    schedule 09.06.2015


Ответы (2)


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

<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, предложенной Мяо Цзяном, на самом деле не сработало и фактически нарушает CORS в моей ситуации, когда я включаю ее сейчас. Я уверен, что это сработает для других ситуаций.

РЕДАКТИРОВАТЬ: я все равно использовал политики, и теперь это работает. Никаких операций 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>
person Bart van der Drift    schedule 10.06.2015

У меня была аналогичная проблема с запросом OPTIONS в веб-API, работающем в Azure. Было доступно простое исправление:

  1. На портале Azure щелкните службу приложений, чтобы открыть интерфейс управления.
  2. Прокрутите список параметров управления вниз, пока не дойдете до раздела «API», и нажмите «CORS».
  3. Либо введите веб-адрес разрешенного источника, либо введите «*», чтобы разрешить все, и нажмите «Сохранить».
person kdpnz    schedule 29.10.2018
comment
Вопрос касался облачной службы Azure, которая не имеет ничего общего со службой приложений Azure. - person JDownloader; 14.05.2020