Wcf 配置IIS Express 8以启用CORS

Wcf 配置IIS Express 8以启用CORS,wcf,visual-studio-2012,cross-domain,cors,iis-express,Wcf,Visual Studio 2012,Cross Domain,Cors,Iis Express,我正在编写WCF服务,这些服务将被野外的客户使用,因此他们需要处理跨源请求。我在启用开发服务器以接受此类请求时遇到问题。以下是场景: 我正在Visual Studio 2012实例中运行WCF项目,使用IIS Express 8作为特定端口上的服务器 我正在Visual Studio 2012的另一个实例中运行客户端项目,也使用IIS Express 8作为服务器。这个项目使用AJAX来使用另一个项目中的服务 当我在IE中运行客户端项目时,没有问题,因为IE没有发送飞行前选项请求。但是,当我

我正在编写WCF服务,这些服务将被野外的客户使用,因此他们需要处理跨源请求。我在启用开发服务器以接受此类请求时遇到问题。以下是场景:

  • 我正在Visual Studio 2012实例中运行WCF项目,使用IIS Express 8作为特定端口上的服务器
  • 我正在Visual Studio 2012的另一个实例中运行客户端项目,也使用IIS Express 8作为服务器。这个项目使用AJAX来使用另一个项目中的服务
当我在IE中运行客户端项目时,没有问题,因为IE没有发送飞行前选项请求。但是,当我在Chrome中运行它时,飞行前选项请求返回一个405方法Not Allowed,Chrome放弃了该服务。以前的Chrome版本只会忽略错误并继续执行实际的POST请求(或Get,无论什么…),但后来的版本似乎更挑剔

我在部署的WCF项目中也遇到了这个问题,并通过将OPTIONSVerbHandler移动到IIS中处理程序映射列表的顶部来解决它

我应该指出,我正在使用我能想到的最慷慨的web.config设置来尝试允许CORS。例如,我在WCF项目的配置中有:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="X-Powered-By" value="*" />
  </customHeaders>
</httpProtocol>

无论如何,从代码运行到WCF项目的任何客户端跨源请求都会失败,并出现405错误

设置WCF项目本身或IIS Express 8以启用CORS是否有帮助

谢谢

  • 因为值仅对访问控制有效,所以允许原点。对于其他人,你需要明确。例如:
访问控制允许方法:获取、放置、发布、删除

或者:

访问控制允许方法:放置、删除


因为规范说GET和POST是隐含的。

答案是,使WCF能够接受CORS飞行前消息所需的配置与IIS服务器无关;相反,WCF项目本身需要配置为使用选项谓词处理HTTP请求


长话短说:做这件事真的很难。当涉及到端点时,WCF是一个万能的工具,所以设置它来使用one(HTTP)做一些非常具体的事情是不可取的,尽管它是可以做到的。真正的解决方案是使用Web API,它是HTTP的大师,可以设置为非常简单地执行CORS。

您可以为wcf启用CORS,一旦您知道如何实现,它可能非常简单

从DavidG对更一般问题的回答中详细阐述,该回答实际上接近基本解决方案所需的回答:

  • 首先,将
    选项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>
    
    
    
    此示例为站点/app/目录(其中是web.config)中所有请求的所有响应设置它们。如果要将它们限制为某个url,请将其放入
    标记中。
    您还可以在IIS控制台中添加这些自定义头

这是一个基本的解决方案,因为即使在不需要CORS头的请求下,它也会发送CORS头,这可能会导致应用程序被意外使用。但是有了WCF,它看起来是最简单的


使用MVC或webapi,我们可以通过代码处理
选项
动词和cors标题(可以“手动”处理,也可以使用最新版本的webapi提供的内置支持)。

我只想提到,在撰写本文时,我不相信web浏览器支持
访问控制允许方法
访问控制允许标题
的*通配符值,即使它在规范中

规格:


请参阅兼容性说明(更易于阅读):


作为上述更好的解决方案的替代,这意味着您必须明确提供您想要允许的每个标题或方法。

我不确定这是否真的像djo.Dadof所说的那样困难。上面的一个答案谈到了如何使用IIS控制台,但问题是关于IIS Express的。公平地说,它讨论了将
选项VerbHandler
移到更高的位置,这实际上可能在IIS Express中起作用,但您必须清除所有处理程序并将其添加回,这在没有IIS这样的控制台的情况下是很困难的,因为您不知道要添加回哪些处理程序。从这个答案可以看出,您真正需要做的就是处理Global.asax.cs,
Application\u BeginRequest
中的选项请求。我补充说

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "content-type");

            HttpContext.Current.Response.End();
        }
连同

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="null" />
  </customHeaders>
</httpProtocol>


在为我工作的webconfig
system.webServer
部分。请注意,当我从本地驱动器打开html页面时,我在
Access Control Allow Headers
标题中使用了
content type
,以匹配Firefox发送的内容,在
Access Control Allow Origin
标题中使用了
null

是否使用WCF服务进行REST?实际上,您可能需要删除
选项verbHandler
,然后自己处理。或者……您可能希望公开
JSONP
。我建议您使用
ASP.Ne