【发布时间】:2013-01-13 19:26:26
【问题描述】:
我正在使用 Thinktecture.IdentityModel nuget 包为 MVC Web 应用程序中的 WebAPI 控制器启用 CORS。目前,我只担心 POST,但让我知道其他动词的任何问题。这在通过 IIS Express 服务器运行时有效。
在处理 AppHarbor 部署时,它不起作用。 nginx 似乎没有将 OPTIONS 请求传递给我的代码。还需要什么才能让它在 AppHarbor 上运行?
请求
选项 $path HTTP/1.1
主机:$服务器名 连接:保持活动
访问控制请求方法:POST
来源:http://www.local
用户代理:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
访问控制请求标头:接受、来源、内容类型
接受:/
推荐人:http://www.local/wordpress/2013/01/request-url-test/
接受编码:gzip、deflate、sdch
接受语言:en-GB,en;q=0.8,en-US;q=0.6
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
响应
HTTP/1.1 200 正常
服务器:nginx
日期:格林威治标准时间 2013 年 1 月 30 日,星期三 02:34:14
内容长度:0
连接:保持活动
允许:OPTIONS、TRACE、GET、HEAD、POST
公共:OPTIONS、TRACE、GET、HEAD、POST
我的 web.config 设置了以下默认处理程序:
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<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,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
是 WebDAV 的罪魁祸首吗?
在 Jeffery To 的建议下,我通过 following these instructions 禁用了 WebDAV。甚至不知道 AH 上安装了 WebDAV,但这样做确实改变了我的结果。
相关的 Web.config 部分
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="WebDAV" />
<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,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
<remove name="AspNetAppHarborIntegration" />
<add name="AspNetAppHarborIntegration" type="Premotion.AspNet.AppHarbor.Integration.AppHarborModule, Premotion.AspNet.AppHarbor.Integration" />
</modules>
请求
选项 $path HTTP/1.1
主机:$servername
连接:保持活动
访问控制请求方法:POST
来源:http://www.local
用户代理:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
访问控制请求标头:接受、来源、内容类型
接受:/
推荐人:http://www.local/wordpress/2013/01/request-url-test/
接受编码:gzip、deflate、sdch
接受语言:en-GB,en;q=0.8,en-US;q=0.6
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
响应
HTTP/1.1 405 方法不允许
服务器:nginx
日期:格林威治标准时间 2013 年 2 月 4 日星期一 17:09:19
内容类型:应用程序/json;字符集=utf-8
内容长度:76
连接:保持活动
缓存控制:无缓存
编译指示:无缓存
过期:-1
【问题讨论】:
-
this solution 能解决您的问题吗?
-
@JefferyTo 并非特别如此,因为该解决方案显示将 OPTIONS 动词添加到 SimpleHandlerFactory-Integrated 模块。默认情况下,该谓词已为 MVC4 项目中的处理程序配置(请参阅编辑)。
-
@JefferyTo 那做了一些事情——我正在研究现在还有什么需要改变的。有什么想法吗?