Kev*_*vin 19 .net c# wcf 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"] = "*";
}
}
Run Code Online (Sandbox Code Playgroud)
通常这可以工作,但不幸的是我的服务也使用HTTP基本授权,这意味着当请求进入而没有Authorization标头时,WCF会自动发送401响应,要求提供凭据.遗憾的是,在此初始交换期间,WCF不会调用我的IDispatchMessageInspector,因此Access-Control-Allow-Origin标头不会添加到初始交换中.
当我尝试从浏览器调用服务时,会出现此问题.CORS指定仅当源域与Access-Control-Allow-Origin响应头中列出的域匹配时才允许跨源请求(*匹配所有域).不幸的是,当浏览器看到没有Access-Control-Allow-Origin标头的初始401响应时,它会阻止访问(根据相同的源策略).
有没有办法在WCF自动发送的初始401响应中添加标头?
gra*_*der 23
这家伙救了我的一天.
http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx
我将把他的一些笔记放在这里,以防万一网页有一天死掉.(我讨厌找到"你的答案就在这里"链接,然后链接已经死了.)
<behaviors>
<endpointBehaviors>
<behavior name="webSupport">
<webHttp />
<CorsSupport />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<services>
<service name="Service.JSonService">
<endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" />
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
现在,您必须找到名为"WebHttpCors.dll"的可下载库.
但是有足够的(上图)可以帮助你google/bing你的解决方案.
让我循环的部分(在我的场景中)是IE正在运行,但Firefox无法正常工作.
我的原始页面是:
http://localhost:53692/test/WCFCallTestViaJQ14.htm
Run Code Online (Sandbox Code Playgroud)
所以我的服务是:
http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh
Run Code Online (Sandbox Code Playgroud)
所以我有localhost << - >> localhost流量.
****但是港口不同.(53692和8002)****
IE浏览器还可以.Firefox并不好.
然后你必须记住每个浏览器以不同的方式处理它们的.Send()请求(在JQUERY中).
这下全说通了.
//JavaScript snipplet from JQuery library
if (window.XMLHttpRequest) {
returnObject = new XMLHttpRequest();
} else if (window.ActiveXObject) {
returnObject = new ActiveXObject("Microsoft.XMLHTTP");
} else {
msg = "Your browser doesn't support AJAX!";
}
Run Code Online (Sandbox Code Playgroud)
这里有一些关键词,我一直在谷歌搜索/叮咬的短语最终导致我在某个地方.
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
Run Code Online (Sandbox Code Playgroud)
为了达到你想要的目的,你需要自己处理授权,这可以通过命令+注册HttpModule来实现...在那里你可以发布401以及你想要的任何http头...这里甚至有一个示例实现SO - 请参阅将基本HTTP身份验证添加到WCF REST服务
编辑 - 在OP发表评论后:
由于OP的评论说他是自托管的,因此解决方案不是与HTTPModule实际相关IDispatchMessageInspector.BeforeSendReply,而是与之相关IDispatchMessageInspector.AfterReceiveRequest.
授权必须配置为"无"并自定义实现/处理IDispatchMessageInspector- 这样您可以在发出401时添加任何标头.否则,运行时处理Basic Auth将不会调用您IDispatchMessageInspector之前正确/正确的Auth.
虽然这有效,但这意味着您自己实施安全敏感代码,因此需要采取适当的措施来确保其正确实施......
| 归档时间: |
|
| 查看次数: |
20232 次 |
| 最近记录: |