关于nginx:我如何在AppHarbor上接受CORS AJAX请求?

How do I accept CORS AJAX requests on AppHarbor?

我正在使用thinkcture.identitymodel nuget包为MVC Web应用程序中的WebAPI控制器启用CORS。目前,我只担心帖子,但如果其他动词有任何问题,请告诉我。这在通过IIS Express服务器运行时有效。

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

请求

OPTIONS $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, like 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
Server: nginx
Date: Wed, 30 Jan 2013 02:34:14 GMT
Content-Length: 0
Connection: keep-alive
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST

我的web.config使用以下默认处理程序进行设置:

1
2
3
4
5
6
7
8
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
 
 
 
</handlers>

是WebDAV的责任吗?

在Jeffery to的建议下,我按照这些说明禁用了WebDAV。甚至不知道在啊上安装了WebDAV,但这样做确实改变了我的结果。

相关web.config节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="WebDAV" />
 
 
 
</handlers>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
  <remove name="AspNetAppHarborIntegration" />
 
</modules>

请求

OPTIONS $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, like 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 Method Not Allowed
Server: nginx
Date: Mon, 04 Feb 2013 17:09:19 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 76
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Expires: -1


WebDAV是导致响应中没有完整CORS头的最初问题的原因。405错误是我的应用程序配置中的某个问题。

在深入研究了内部结构之后,似乎用于WebAPI(由thinkcture提供)的corsmessagehandler没有正确识别飞行前请求,并且这些请求被路由到WebAPI对象本身。

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


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