WCF REST服务中的CORS支持

我在Windows服务中托管了WCF REST服务,并且我希望每次响应都发送Access-Control-Allow-Origin HTTP标头(定义为CORS的一部分)。

我尝试的解决方案是在IDispatchMessageInspector实现中使用以下内容:

public void BeforeSendReply(ref Message reply, object correlationState) { var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; if (httpResponse != null) { // test of CORS httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; } } 

通常这会起作用,但不幸的是我的服务也使用HTTP基本授权 ,这意味着当请求进入而没有Authorization标头时,WCF会自动发送401响应,要求提供凭据。 遗憾的是,在此初始交换期间,WCF不会调用我的IDispatchMessageInspector,因此Access-Control-Allow-Origin标头不会添加到初始交换中。

当我尝试从浏览器调用服务时,会出现此问题。 CORS指定仅当源域与Access-Control-Allow-Origin响应头中列出的域匹配时才允许跨源请求(*匹配所有域)。 不幸的是,当浏览器看到没有Access-Control-Allow-Origin标头的初始401响应时,它会阻止访问(根据相同的源策略 )。

有没有办法在WCF自动发送的初始401响应中添加标头?

这家伙救了我的一天。

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

我将把他的一些笔记放在这里,以防网页有一天死掉。 (我讨厌找到“你的答案就在这里”链接,然后链接已经死了。)

                   

现在,您必须找到名为“WebHttpCors.dll”的可下载库。

但是那里有足够的(上图)可以帮助你google / bing你的解决方案。

抛出循环的部分(在我的场景中)是IE正在运行,但Firefox无法正常工作。

我的原始页面是:

 http://localhost:53692/test/WCFCallTestViaJQ14.htm 

所以我的服务是:

 http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

所以我有localhost << - >> localhost流量。

****但是港口不同。 (53692和8002)****

IE浏览器还可以。 Firefox并不好。

然后你必须记住每个浏览器以不同方式处理它们的.Send()请求(在JQUERY中)。

这下全说通了。

 //JavaScript snipplet if (window.XMLHttpRequest) { returnObject = new XMLHttpRequest(); } else if (window.ActiveXObject) { returnObject = new ActiveXObject("Microsoft.XMLHTTP"); } else { msg = "Your browser doesn't support AJAX!"; } 

这里有一些关键词,我一直在谷歌搜索/叮咬的短语最终导致我在某个地方。

  Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] XMLHttpRequest Send "NS_ERROR_FAILURE" JQuery Ajax WCF Self Hosted CORS JSON 

为了达到你想要的目的,你需要自己处理授权,这可以通过命令+注册HttpModule来实现…在那里你可以发布401以及你想要的任何http头…这里甚至有一个示例实现SO – 请参阅将基本HTTP身份validation添加到WCF REST服务

编辑 – 在OP发表评论后:

由于OP的评论说他是自托管的,因此解决方案不是使用HTTPModule而是实际使用IDispatchMessageInspector.BeforeSendReplyIDispatchMessageInspector.AfterReceiveRequest

必须将Authorization配置为“None”并在IDispatchMessageInspector自定义实现/处理 – 这样您可以在发出401时添加任何标头。 否则,运行时处理Basic Auth将不会在正确/正确的Auth之前调用您的IDispatchMessageInspector

虽然这可以保证这意味着你自己实现了安全敏感代码,因此需要采取适当的措施来确保其正确实施……