我如何接受AppHarbor上的CORS AJAX请求?

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

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

请求

选项$ path HTTP / 1.1
主机:$ servername连接:保持活动状态
访问控制请求方法:POST
起源:http://www.local
用户代理: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:接受,起源,内容类型
接受:/
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
连接:保持活跃
允许:选项,追踪,获取,头,邮政
公开:选项,追踪,获取,头,邮政

我的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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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。 甚至不知道WebDAV安装在AH上,但这样做确实改变了我的结果。

相关的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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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
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:接受,起源,内容类型
接受:/
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
Content-Type:application / json; 字符集= utf-8的
内容长度:76
连接:保持活跃
缓存控制:无缓存
Pragma:无缓存
过期:-1


WebDAV应该归咎于在响应中没有获得完整的CORS头部的最初问题。 405错误是我的应用程序配置中的某个问题。

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

我通过转移到IIS模块而不是WebAPI来解决此问题。 这可能会使未来的生活变得更加困难,但至少它会起作用。


我可能在这里错过了一些东西,但是基于你包含的示例响应,似乎OPTIONS方法实际上已发送到您的应用程序 - AllowPublic标题包含在响应中。

链接地址: http://www.djcxy.com/p/42449.html

上一篇: How do I accept CORS AJAX requests on AppHarbor?

下一篇: How does Access