从 jQuery 访问 Web 服务 - 跨域
Posted
技术标签:
【中文标题】从 jQuery 访问 Web 服务 - 跨域【英文标题】:Accessing web Service from jQuery - cross domain 【发布时间】:2011-02-11 10:59:09 【问题描述】:我正在尝试从 jQuery 客户端访问 wcf 服务
特别是这个例子 http://www.codeproject.com/KB/aspnet/WCF_JQUERY_ASMX.aspx#4
当客户端网页与服务位于同一域时,一切正常
当我将客户端网页移到另一个域时,它就会中断。无法访问服务,请求失败
这发生在所有示例中,ASMX、REST 和 WCF
有什么想法可以让这个跨 daomain 工作吗?
【问题讨论】:
【参考方案1】:我在 2 天内遇到了同样的问题,我找到了解决方案,并且在谷歌上搜索了很多之后它很优雅。 我需要一些小部件客户端的 xss Ajax,这些客户端将数据流从层级网站拉到我的 Rails 应用程序。 here's how I did.
【讨论】:
这只是 JSONP 解决您的问题。您根本不必将其包装在 DOM 对象中。【参考方案2】:您正在违反同源策略。您正在访问的 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);
【讨论】:
那么,您对同一域上的服务进行 ajax 调用并将请求转发到预期服务的想法是什么?但是从没有浏览器施加的那种限制的服务器端代码中这样做呢? 如果您正在谈论使用代理,那么是的,那是完全正确的。 SOP 由浏览器强制执行,因此 PHP、ASP、ColdFusion 等不受其约束。你的 JS 向代理发出请求,代理向服务发出请求,然后代理将结果传回给 JS。 我应该指出,使用代理可能会稍微增加流量和等待时间,因为您现在发出两个请求而不是一个。 JS --> 代理 --> 服务 当然,明白。那么这些信息最终会被 Flash 电影所消耗。所以我认为让包含页面从 Javascript 发出请求可能是最好的方法。但来自 Flash 的请求可能更容易,我只是应用跨域策略【参考方案3】:通常情况下,您不能;现代浏览器对此进行了限制以防止跨站点脚本攻击。解决它的一种方法可能是使用“填充”JSON,JSONP,它将结果插入页面上的脚本元素中。有一个 Microsoft WCF sample here 似乎可以做到这一点。
【讨论】:
【参考方案4】:您可能想查看JSONP (JSON with Padding)。简而言之,它涉及向页面添加一个脚本元素,其中 Web 服务 url 作为 src。然后,Web 服务将 JSON 作为第一个参数包装在一个回调函数中,该回调函数在解析脚本时执行。
脚本元素不受Same Origin Policy 的约束,这就是它们能够解决此问题的方法。
【讨论】:
添加 CrossDomain.XML 会有用吗?还是没有那么简单? @Christo Fur:将 crossdomain.xml 文件添加到 Web 服务所在的域将使 Flash 应用程序能够向 API 发出跨站点请求,如果 XML 文件允许Flash 应用程序驻留在(更多信息:jimbojw.com/wiki/index.php?title=Cross-domain_Ajax_via_Flash) @Christo Fur:+ RoseOfJericho 所说的话。您可以查看Access-Control
标头,但浏览器并未广泛支持它们(可能只有 Fx),并且 IE8 要求您使用 XDomainRequest()
而不是 XMLHttpRequest()
。 JSONP 确实是 x 浏览器兼容性的最佳选择。
@Christo Fur:我听说 Chrome 部分支持 Access-Control-Allow-Origin 和相关标头,但是是的,依赖于跨域资源共享规范(仍在工作草案中W3C 阶段),您实际上只是让 Firefox 用户可以使用您的网站……目前。
是否可以使用 JSONP 发布数据?还是必须在查询字符串中传递所有内容?以上是关于从 jQuery 访问 Web 服务 - 跨域的主要内容,如果未能解决你的问题,请参考以下文章
我们可以在跨域中使用 Jquery $.ajax() 调用通过 https 访问 WCF 服务吗?
如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?
如何避免 jquery ajax 中使用 wcf 服务的跨域策略?