Javascript 在IIS7上实现跨源资源共享
我最近遇到了向另一个域发布Javascript请求的问题。默认情况下,不允许向其他域发布XHR 按照中的说明,我在另一个域上启用了此功能Javascript 在IIS7上实现跨源资源共享,javascript,iis-7,xmlhttprequest,cors,Javascript,Iis 7,Xmlhttprequest,Cors,我最近遇到了向另一个域发布Javascript请求的问题。默认情况下,不允许向其他域发布XHR 按照中的说明,我在另一个域上启用了此功能 <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allo
<?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>
更新:3/02/2014
MSDN杂志最近更新了一篇文章。详细介绍ASP.NET Web API 2中的CORS支持
405响应是“不允许使用方法”响应。听起来您的服务器没有正确配置以处理CORS飞行前请求。你需要做两件事:
1) 启用IIS7以响应HTTP选项请求。您获得405,因为IIS7拒绝选项请求。我不知道怎么做,因为我不熟悉IIS7,但堆栈溢出上可能还有其他人这样做
2) 配置应用程序以响应CORS飞行前请求。您可以通过在
部分的访问控制允许原点
行下方添加以下两行来完成此操作:
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
可能是IIS 7“处理”HTTP选项响应,而不是应用程序指定它。为了确定这一点,在IIS7中
转到站点的处理程序映射
向下滚动至“OPTIONSVerbHandler”
将“ProtocolSupportModule”更改为“IsapiHandler”
设置可执行文件:
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet\u isapi.dll
现在,当发送HTTP选项谓词时,上面的配置条目应该生效
或者,您可以响应BeginRequest方法中的HTTP选项谓词
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();
}
}
我发现在为IIS7中的WCF服务设置HTTP选项时,在上找到的信息非常有用
我在web.config中添加了以下内容,然后将IIS 7“hander mappings”列表中的选项VerbHandler移动到列表的顶部。我还提供了选项VerbHander read access,方法是双击处理程序映射部分中的hander,然后单击“请求限制”,然后单击access选项卡
不幸的是,我很快发现IE似乎不支持向其对象添加标题(将内容类型设置为text/xml并添加SOAPAction标题)
我只是想和大家分享一下,因为我花了一天的大部分时间在寻找如何处理它
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
</customHeaders>
</httpProtocol>
</system.webServer>
我不能发表评论,所以我必须把它放在一个单独的答案中,但它与沙阿接受的答案有关
最初,我按照Shah的回答(谢谢!)在IIS中重新配置了选项VerbHandler,但在重新部署应用程序时,我的设置被恢复
我最终删除了Web.config中的选项VerbHandler
<handlers>
<remove name="OPTIONSVerbHandler"/>
</handlers>
详细说明基本解决方案所需的内容:
- 首先,将选项VerbHandler配置为在.Net处理程序之前执行
- 在IIS控制台中,选择“处理程序映射”(在服务器级别或站点级别上;注意,在站点级别上,它将重新定义站点的所有处理程序,并忽略在此之后在服务器级别上所做的任何更改;当然,在服务器级别上,如果其他站点需要自己处理选项,这可能会破坏它们)李>
- 在操作窗格中,选择“查看有序列表…”查找选项VerbHandler,然后将其上移(大量单击…)
您也可以在web.config中通过重新定义
下的所有处理程序来完成此操作(
然后
将它们重新定义,这就是IIS控制台为您所做的事情)(顺便说一句,不需要请求此处理程序的“读取”权限。)
其次,为您的cors需求配置自定义http头,例如:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
</customHeaders>
</httpProtocol>
</system.webServer>
您也可以在IIS控制台中执行此操作
这是一个基本的解决方案,因为即使在不需要cors头的请求下,它也会发送cors头。但是有了WCF,它看起来是最简单的
使用MVC或webapi,我们可以通过代码处理选项谓词和cors标题(可以“手动”处理,也可以使用最新版本的webapi中提供的内置支持)。使用ASP.net Web API 2,通过nuget安装Microsoft ASP.net跨源支持
阿尔萨兰·阿莱库姆
第一种方法是按照此链接中的说明进行操作:
与这些配置相对应的:
我的解决方案是添加:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
</system.webServer>
对于我的web.config来说,这些答案中没有提到的一件事是,如果您正在使用IIS,并且子应用程序具有各自独立的web.config,那么您可能需要在父目录中有一个包含以下代码的web.config
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
</customHeaders>
</httpProtocol>
微软花了数年时间找出差距,并推出带外CORS模块来解决这个问题
从安装模块
带着片段
如下
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="http://*" allowed="true" />
</cors>
</system.webServer>
</configuration>
Shah的IIS isapiHandler配置不起作用,但我没有尝试编程方式。然而,我在web.config中也发现了上面的WCF配置。Chrome仍然发送选项并在第一次获得405,但随后它发布了另一个请求,这是正确的。Chrome的当前版本似乎不再考虑在具有错误http状态的响应上收到的cors头。因此,在这种情况下,它将不再继续执行跨域请求。这是一个更好的行为,谢谢你的回应。如果您浏览了上面的响应,请不要忘记如上所述提供选项VerbHander read access。指定源更安全。看:
我两种方法都试过了
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
</customHeaders>
</httpProtocol>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="http://*" allowed="true" />
</cors>
</system.webServer>
</configuration>