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

标签: ajax nginx cors appharbor


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我的错。我忘了反向代理请求会更改服务器标头。
    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多