2

我正在使用 Thinktecture.IdentityModel nuget 包为 MVC Web 应用程序中的 WebAPI 控制器启用 CORS。目前,我只担心 POST,但让我知道其他动词的任何问题。这在通过 IIS Express 服务器运行时有效。

在处理 AppHarbor 部署时,它不起作用。nginx 似乎没有将 OPTIONS 请求传递给我的代码。还需要什么才能让它在 AppHarbor 上运行?

要求

选项 $path HTTP/1.1
Host: $servername Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.local
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML,如 Gecko)Chrome/24.0.1312.56 Safari/537.17
Access-Control-Request-Headers:accept,origin,content-type
Accept:/
Referer:http://www.local/wordpress/2013/01/request- url-test/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q= 0.7,*;q=0.3

回复

HTTP/1.1 200 OK
服务器:nginx
日期:2013 年 1 月 30 日星期三 02:34:14 GMT
内容长度:0
连接:保持活动
允许:OPTIONS、TRACE、GET、HEAD、POST
公开:OPTIONS、TRACE、GET、负责人,职位

我的 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 的建议下,我按照这些说明禁用了 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
Host: $servername
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.local
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML,如 Gecko)Chrome/24.0.1312.57 Safari/537.17
Access-Control-Request-Headers:accept,origin,content-type
Accept:/
Referer:http://www.local/wordpress/2013/01/request- url-test/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q= 0.7,*;q=0.3

回复

HTTP/1.1 405 方法不允许
服务器:nginx
日期:星期一,2013 年 2 月 4 日 17:09:19 GMT
内容类型:应用程序/json;charset=utf-8
Content-Length: 76
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Expires: -1

4

2 回答 2

2

WebDAV 应归咎于在响应中未获取完整 CORS 标头的最初问题。405 错误是我的应用程序配置中的某个问题。

在深入研究内部之后,似乎与 WebAPI 一起使用的 CORSMessageHandler(由 Thinktecture 提供)没有正确识别预检请求,并且这些请求被路由到 WebAPI 对象本身。

我通过移动到IIS 模块而不是 WebAPI 模块来解决这个问题。这可能会使未来的生活更加困难,但至少它是有效的。

于 2013-02-04T23:50:52.577 回答
0

我可能在这里遗漏了一些东西,但根据您包含的示例响应,该方法似乎OPTIONS实际上已发送到您的应用程序 -响应中包含AllowPublic标头。

于 2013-01-31T05:12:07.727 回答