使用jQuery AJAX的WCF REST - 删除/解决相同的源策略

时间:2010-06-09 21:19:07

标签: javascript jquery ajax rest cross-domain

所以我正在尝试创建一个由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时,您也不能使用“*”。

3 个答案:

答案 0 :(得分:5)

您还可以考虑吐出额外的http标头,以便在您的网络服务上启用跨域请求。

这里描述:

http://www.w3.org/TR/cors/

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>