【问题标题】:Accessing web Service from jQuery - cross domain从 jQuery 访问 Web 服务 - 跨域
【发布时间】:2011-02-11 10:59:09
【问题描述】:

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

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

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

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

这发生在所有示例中,ASMX、REST 和 WCF

有什么想法可以让这个跨 daomain 工作吗?

【问题讨论】:

    标签: jquery ajax wcf json cross-domain


    【解决方案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 发布数据?还是必须在查询字符串中传递所有内容?
      猜你喜欢
      • 2013-05-15
      • 2014-11-11
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多