And*_*rew 84 javascript iis-7 xmlhttprequest cors
我最近遇到了将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>
Run Code Online (Sandbox Code Playgroud)

现在一切正常,但是在发回工作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
Run Code Online (Sandbox Code Playgroud)
更新:3/02/2014
MSDN杂志上有一篇最近更新的文章.详细介绍ASP.NET Web API 2中的CORS支持.
Men*_*hak 74
可能是IIS 7'处理'HTTP OPTIONS响应而不是指定它的应用程序的情况.要确定这一点,在IIS7中,
转到您网站的处理程序映射.
向下滚动到'OPTIONSVerbHandler'.
将'ProtocolSupportModule'更改为'IsapiHandler'
设置可执行文件:%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();
}
}
Run Code Online (Sandbox Code Playgroud)
Hei*_*tad 24
我不能发表评论所以我必须将其放在一个单独的答案中,但这与Shah接受的答案有关.
我最初通过在IIS中重新配置OPTIONSVerbHandler来回答Shahs的回答(谢谢!),但是当我重新部署应用程序时,我的设置已经恢复.
我最终删除了我的Web.config中的OPTIONSVerbHandler.
<handlers>
<remove name="OPTIONSVerbHandler"/>
</handlers>
Run Code Online (Sandbox Code Playgroud)
Dav*_*idG 18
我发现http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html上的信息非常有助于为IIS 7中的WCF服务设置HTTP OPTIONS.
我将以下内容添加到我的web.config中,然后将IIS 7'hander mappings'列表中的OPTIONSVerbHandler移动到列表顶部.我还通过双击处理程序映射部分中的hander然后单击"Request Restrictions"然后单击"访问"选项卡,给出了OPTIONSVerbHander读取访问权限.
不幸的是,我很快发现IE似乎不支持向其XDomainRequest对象添加标头(将Content-Type设置为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>
Run Code Online (Sandbox Code Playgroud)
405响应是"不允许的方法"响应.听起来您的服务器没有正确配置来处理CORS预检请求.你需要做两件事:
1)启用IIS7以响应HTTP OPTIONS请求.您正在获取405,因为IIS7拒绝OPTIONS请求.我不知道如何做到这一点,因为我不熟悉IIS7,但Stack Overflow上可能还有其他人.
2)配置应用程序以响应CORS预检请求.您可以通过Access-Control-Allow-Origin在该<customHeaders>部分的行下面添加以下两行来完成此操作:
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
Run Code Online (Sandbox Code Playgroud)
您可能必须Access-Control-Allow-Headers根据请求要求的标头向该部分添加其他值.您是否有提出请求的示例代码?
您可以在此处了解有关CORS和CORS预检的更多信息:http://www.html5rocks.com/en/tutorials/cors/
首先,配置OPTIONSVerbHandler以在.Net处理程序之前执行.
您也可以在web.config中重新定义所有处理程序<system.webServer><handlers>(<clear>然后再<add ...>返回,这就是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>
Run Code Online (Sandbox Code Playgroud)
您也可以在IIS控制台中执行此操作.
这是一个基本的解决方案,因为即使在不需要它的请求上它也会发送cors头.但是使用WCF,它看起来像是最简单的一个.
使用MVC或webapi,我们可以通过代码处理OPTIONS动词和cors标题("手动"或在最新版本的webapi中提供内置支持).
Microsoft 花了数年时间才找出差距并发布带外 CORS 模块来解决此问题。
如下
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="http://*" allowed="true" />
</cors>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
通常,它比自定义标头容易得多,并且还可以更好地处理预检请求。
如果您需要相同的 IIS Express,请使用我编写的一些 PowerShell 脚本。
| 归档时间: |
|
| 查看次数: |
184199 次 |
| 最近记录: |