如何在AppHarbor上接受CORS AJAX请求?

时间:2013-01-30 03:33:41

标签: ajax nginx cors appharbor

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

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

请求

  

OPTIONS $ 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.56 Safari / 537.17
  访问控制请求标题:接受,来源,内容类型
  接受: /
  推荐人: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,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>

请求

  

OPTIONS $ 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.57 Safari / 537.17
  访问控制请求标题:接受,来源,内容类型
  接受: /
  推荐人: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:no-cache
  过期:-1

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

我可能在这里遗漏了一些内容,但根据您添加的示例回复,似乎OPTIONS方法实际上已发送到您的应用程序 - AllowPublic标题包含在回复中。