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

Posted

技术标签:

【中文标题】如何在 AppHarbor 上接受 CORS AJAX 请求?【英文标题】:How do I accept CORS AJAX requests on AppHarbor? 【发布时间】: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 项目中的处理程序配置(请参阅编辑)。 disabling WebDAV 呢? @JefferyTo 那做了一些事情——我正在研究现在还有什么需要改变的。有什么想法吗? 【参考方案1】:

WebDAV 最初的问题是没有在响应中获取完整的 CORS 标头。 405 错误是我的应用配置中的某个问题。

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

我的错。我忘了反向代理请求会更改服务器标头。

以上是关于如何在 AppHarbor 上接受 CORS AJAX 请求?的主要内容,如果未能解决你的问题,请参考以下文章

在 appharbor 上构建 web 服务时无法找到 nuget.exe

尝试在 AppHarbor 上查看我的 MVC4 应用程序时出现 403 错误(禁止)

在 AppHarbor 上的 MVC3 内运行 WCF WebAPI Prev 6,出现 404 错误

Express 配置为使用 CORS 不接受 CORS

如何在 ASP.NET Core 中启用 CORS

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?