在Azure Cloud Service上启用OPTIONS方法(以启用CORS)

时间:2015-06-09 09:40:40

标签: azure cors azure-api-management

我正在使用Azure API Management开发一个公共API,然后在我的云服务中调用服务方法。 要允许其他应用程序在浏览器环境中使用此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上处理?

2 个答案:

答案 0 :(得分: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"/>

答案的另一部分是在API Management中添加OPTIONS操作。 使用苗江建议的API管理的CORS策略实际上没有用,实际上在我现在包含CORS的情况下会破坏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>

答案 1 :(得分:0)

我在Azure上运行的Web API上的OPTIONS请求有类似的问题。有一个简单的修复程序:

  1. 在Azure门户中,单击您的App Service打开管理界面。
  2. 向下滚动管理选项列表,直到到达“ API”部分,然后单击“ CORS”
  3. 输入允许的来源的网址,或输入“ *”以全部允许,然后单击“保存”。