Javascript 在IIS7上实现跨源资源共享

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

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

按照中的说明,我在另一个域上启用了此功能

<?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>