在 IIS7 上启用跨域资源共享

新手上路,请多包涵

我最近遇到了将 Javascript 请求发布到另一个域。默认情况下,不允许将 XHR 发布到其他域。

按照 http://enable-cors.org/ 的说明,我在另一个域上启用了此功能。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
    </customHeaders>
  </httpProtocol>
 </system.webServer>
</configuration>

在此处输入图像描述

现在一切正常,但是在发回正常工作的 200 响应之前,它仍然返回 405 响应。

Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

更新:2014 年 3 月 2 日

MSDN 杂志上有一篇最近更新的文章。详细介绍 ASP.NET Web API 2 中的 CORS 支持。

http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

原文由 Andrew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 616
2 个回答

这很可能是 IIS 7“处理”HTTP OPTIONS 响应而不是您的应用程序指定它的情况。为了确定这一点,在 IIS7 中,

  1. 转到您站点的处理程序映射。

  2. 向下滚动到“OPTIONSVerbHandler”。

  3. 将“协议支持模块”更改为“IsapiHandler”

  4. 设置可执行文件:

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

现在,当发送 HTTP OPTIONS 动词时,上面的配置条目应该会启动。

或者,您可以在 BeginRequest 方法中响应 HTTP OPTIONS 动词。

 protected void Application_BeginRequest(object sender,EventArgs e)
 {
 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

 if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
 {
 //These headers are handling the "pre-flight" OPTIONS call sent by the browser
 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
 HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
 HttpContext.Current.Response.End();
 }

 }

原文由 Mendhak 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不能发表评论,所以我必须把它放在一个单独的答案中,但这与 Shah 接受的答案有关。

我最初通过在 IIS 中重新配置 OPTIONSVerbHandler 来遵循 Shahs 的回答(谢谢!),但是当我重新部署我的应用程序时我的设置被恢复了。

我最终在我的 Web.config 中删除了 OPTIONSVerbHandler。

 <handlers>
    <remove name="OPTIONSVerbHandler"/>
</handlers>

原文由 Hein Andre Grønnestad 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题