从jQuery访问Web服务 - 跨域

时间:2010-04-23 09:43:36

标签: jquery ajax wcf json cross-domain

我正试图从jQuery客户端访问wcf服务

特别是这个例子 http://www.codeproject.com/KB/aspnet/WCF_JQUERY_ASMX.aspx#4

当客户端网页与服务位于同一域时,一切正常

一旦我将客户端网页移动到另一个域,它就会中断。它无法访问服务,请求失败

这适用于所有示例,ASMX,REST和WCF

任何想法如何让这个工作交叉daomain?

4 个答案:

答案 0 :(得分:10)

您正在违反同源政策。您正在访问的Web服务必须与发出请求的jQuery脚本位于同一域中。所有浏览器都强制执行此策略,以防止 - 例如 - 对Web应用程序的跨站点脚本和代码注入攻击。

有各种各样的方法,包括JSONP,Proxies或Flash。

在我们建议您应该使用哪种技术之前,我们需要更多信息。我倾向于JSONP。但与此同时,这里有一些轻松的阅读:

http://taossa.com/index.php/2007/02/08/same-origin-policy/

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

以下是JSONP的使用示例:

url = "http://www.test.com/getData.php?callback=parseResults";

document.body.appendChild((function() {
    var newScript = document.createElement("script");
    newScript.type = "text/javascript";
    newScript.src = url;
    return newScript;
})());

function parseResults(data) {
    alert(data);
}

答案 1 :(得分:1)

您可能想查看JSONP (JSON with Padding)。简而言之,它涉及向页面添加一个脚本元素,其中Web服务URL作为src。然后,Web服务将JSON包装为回调函数中的第一个参数,该函数在解析脚本时执行。

脚本元素免于Same Origin Policy,这就是他们能够解决这个问题的方法。

答案 2 :(得分:0)

通常,你将无法;现代浏览器限制此操作以防止跨站点脚本攻击。解决它的一种方法可能是使用“填充”JSON,JSONP,它将结果插入到页面上的脚本元素中。有一个Microsoft WCF sample here似乎可以做到这一点。

答案 3 :(得分:0)

我在2天内遇到了同样的问题,我找到了解决方案,并且在google搜索后很优雅。 我需要一些小部件客户端的xss Ajax,它将数据流从层网站拉到我的Rails应用程序。 here's how I did.