Wcf 配置IIS Express 8以启用CORS
我正在编写WCF服务,这些服务将被野外的客户使用,因此他们需要处理跨源请求。我在启用开发服务器以接受此类请求时遇到问题。以下是场景: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没有发送飞行前选项请求。但是,当我
- 我正在Visual Studio 2012实例中运行WCF项目,使用IIS Express 8作为特定端口上的服务器
- 我正在Visual Studio 2012的另一个实例中运行客户端项目,也使用IIS Express 8作为服务器。这个项目使用AJAX来使用另一个项目中的服务
<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对更一般问题的回答中详细阐述,该回答实际上接近基本解决方案所需的回答:
- 首先,将
配置为在.Net处理程序之前执行选项VerbHandler
- 在IIS控制台中,选择“处理程序映射”。(在服务器级别或站点级别上执行此操作。在站点级别上,它将重新定义站点的所有处理程序,并忽略此后在服务器级别上所做的任何更改。当然,在服务器级别上,如果其他站点需要自己处理选项,这可能会破坏它们。)
- 在操作窗格中,选择“查看订单列表…”。查找
,并将其向上移动(大量单击…)选项VerbHandler
您还可以在web.config中通过重新定义
下的所有处理程序来完成此操作。(
然后
返回,这就是IIS控制台为您所做的。顺便说一句,不需要请求此处理程序的“读取”权限。)
<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控制台中添加这些自定义头
使用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