所以我正在尝试创建一个由jQuery调用的C#WCF REST服务。我发现jQuery要求AJAX调用是在相同的源策略下进行的。关于如何继续,我有几个问题。
我已经知道了;
1. JSONP与服务器回调的hacky解决方案
2.拥有跨域代理的服务器开销过多的方式
3.在浏览器中使用Flash进行调用并在我的WCF服务器根目录下设置crossdomain.xml。
我宁愿不使用这些因为;
1.我不想使用JSON,或者至少我不想限制使用它
2.我想将提供静态页面的服务器与提供应用程序状态的服务器分开
3.这个时代的闪光是不可能的。
我在想:有没有类似Flash的crossdomain.xml文件适用于jQuery?这个“同源”策略是jQuery的一部分还是特定浏览器中的限制?如果它只是jQuery的一部分,也许我会尝试挖掘代码来解决它。
修改
Shreddd得到了相当多的信息,见下文。要在C#中执行此操作,我创建了以下方法,您需要调用所有服务方法:
private void BypassCrossDomain()
{
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
}
重要的是要注意,这允许跨站点脚本攻击,当您需要使用您的请求发送第三方cookie时,您也不能使用“*”。
答案 0 :(得分:5)
您还可以考虑吐出额外的http标头,以便在您的网络服务上启用跨域请求。
这里描述:
https://developer.mozilla.org/en/HTTP_access_control
因此,如果您将以下标头添加到您的网络服务提供的任何内容中:
Access-Control-Allow-Origin: *
浏览器将允许对该网络服务的跨域请求。这在大多数现代浏览器(ff 3.5,IE 8,safari 4)中都得到支持,并且似乎非常适合在域foo.com上托管的jquery应用程序,这些应用程序可以调用bar.com进行ajax调用
答案 1 :(得分:1)
不幸的是,同源策略是对浏览器的限制,而不是jQuery的明确部分,因此我怀疑你是否会找到解决方法。
我建议你最好的办法是坚持使用JSONP解决方案。是的,你可以说是“hacky”,但它是一个被广泛接受的“黑客”,正是因为你正面临的原因(即它是唯一可行的选择之一)。
至于限制使用JSON,如果您控制服务调用的两端,则没有理由不能使用JSONP样式使用模式,但实际上不使用JSON ...您的服务器响应只是要传递给客户端的JavaScript函数,所以没有阻止你返回一个字符串&中的XML。然后让你的回调解析&处理(虽然,这可能会推动你进入真正的“hacky”领域)。
答案 2 :(得分:0)
两天的狩猎,终于找到了这个!比你csuave!
由于我的WCF应用程序是自托管的(将xml添加到app.config并且web.config没有帮助),但这样做有效!
private void BypassCrossDomain()
{
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow- Origin", "*");
}
- 不适用于自托管:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin"
value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>