在IIS7上启用跨源资源共享

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支持.

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

Men*_*hak 74

可能是IIS 7'处理'HTTP OPTIONS响应而不是指定它的应用程序的情况.要确定这一点,在IIS7中,

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

  2. 向下滚动到'OPTIONSVerbHandler'.

  3. 将'ProtocolSupportModule'更改为'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();
        }

    }
Run Code Online (Sandbox Code Playgroud)

  • 该死的ASP.NET和IIS.为什么要配置像CORS这样简单的概念呢?这真的很简单.只需阅读W3C的规范.你可以在10分钟内学习它,然后你需要10天时间来弄清楚如何在ASP.NET和IIS中配置它. (12认同)
  • 我尝试了这两种方法,但只有BeginREquest方法适合我.谢谢@Shah (4认同)
  • 经过2天的研究,使用基于"Application_BeginRequest"的替代解决方案是我解决问题的唯一方法.我尝试使用`customHeaders`(http://stackoverflow.com/a/19091291/827168)的其他方法,删除`OPTIONSVerbHandler`处理程序,删除`WebDAV`模块和处理程序(http://stackoverflow.com/a/20705500/ 827168)但没有一个对我有效.希望这会有助于其他人.并感谢@Mendhak的回答! (4认同)
  • @Mendhak,你救了我的生命哈哈.我添加的东西总是`HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials","true");`因为共享身份验证cookie. (3认同)

Hei*_*tad 24

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

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

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

<handlers>
    <remove name="OPTIONSVerbHandler"/>
</handlers>
Run Code Online (Sandbox Code Playgroud)

  • 对于那些每天没有使用web.config的人来说,这里面就是"<system.webServer>" (12认同)

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)


mon*_*sur 9

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/


Fré*_*ric 8

DavidG的回答中解释出一个基本解决方案所需要的答案:

  • 首先,配置OPTIONSVerbHandler以在.Net处理程序之前执行.

    1. 在IIS控制台中,选择"处理程序映射"(在服务器级别或站点级别;请注意,在站点级别,它将重新定义站点的所有处理程序,并忽略在此之后在服务器级别上所做的任何更改;当然,在服务器级别,如果他们需要自己处理选项动词,这可能会破坏其他网站.
    2. 在"操作"窗格中,选择"查看有序列表..."查找OPTIONSVerbHandler,并将其向上移动(大量点击...).

    您也可以在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中提供内置支持).


Lex*_* Li 6

Microsoft 花了数年时间才找出差距并发布带外 CORS 模块来解决此问题。

  1. Microsoft安装模块
  2. 用片段配置它

如下

<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 脚本