这个OPTIONS请求响应了200 OK,但这不是来自我的WebAPI应用程序。
我有一个自定义消息处理程序到位,它从来没有得到打击,所以请求在IIS之前得到响应,然后再打ASP.NET。
我已经找到了几个关于这个问题的帖子,他们说如下
>确保WebDav被卸载/删除/禁用 – 完成
>确保OPTIONSVerbHandler被删除/更改为使用aspnet_isapi.dll – TRIED BOTH
>确保extensionlessURLHandler包含OPTIONS动词 – DONE
但是,我的选择请求仍然被劫持。我的意思是,IIS以200 OK响应,但不包括响应中的Access-Control-Allow-Origin标头。它不包括这个头,因为它从来没有得到我的WebAPI CORS代码,将设置这个头。
我可以发现两个最好的帖子听起来像我的问题
这里:JQuery stuck at CORS preflight and IIS ghost response
在这里:http://brockallen.com/2012/10/18/cors-iis-and-webdav/
我尝试在IIS中打开失败请求跟踪(FERB),并将其设置为跟踪所有200个状态代码。我没有看到正在记录的选项请求…不知道这是否意味着FERB不跟踪OPTIONS请求,或者如果我需要更改FERB设置中的某些内容以使其跟踪OPTIONS请求,或者如果这是一个线索我的问题是什么?
这是在IIS 7.5上运行的ASP.NET WebAPI 2.0(也在IIS 8和IISExpress上测试了相同的结果)
无论什么浏览器(Chrome,FF和IE都以同样的方式失败)
帮助我StackOverflow,你是我唯一的希望。
解决方法
<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDavModule" /> </modules>
然后将您的处理程序设置如下:
<handlers> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="WebDav" /> <remove name="OPTIONSVerbHandler" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers>
这应该是诀窍,但如果没有,作为最后的手段,您可以强制IIS输出正确的标题与以下:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET,OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> </customHeaders> </httpProtocol> </system.webServer>