【发布时间】:2009-02-17 05:17:42
【问题描述】:
是否可以使用 Javascript 对 WCF 服务进行跨站点调用?
我不介意它是 POST 还是 GET。
但我听说这些天来,浏览器不允许使用 POST 或 GET 进行跨站点调用。
我怎样才能绕过这个并仍然调用 WCF 服务?
【问题讨论】:
标签: javascript wcf json cross-site
是否可以使用 Javascript 对 WCF 服务进行跨站点调用?
我不介意它是 POST 还是 GET。
但我听说这些天来,浏览器不允许使用 POST 或 GET 进行跨站点调用。
我怎样才能绕过这个并仍然调用 WCF 服务?
【问题讨论】:
标签: javascript wcf json cross-site
要绕过浏览器的跨站点脚本拦截器,您无能为力。这些阻止程序阻止 XMLHTTPRequest 发生在任何域,但加载包含脚本或页面的域除外。
也就是说,有一个常用的解决方法:使用 JavaScript 在 DOM 中写入一个新条目,该条目引用作为跨站点 URL 的 src。你将把你所有的 RPC 方法参数传递给这个“脚本”,它会返回一些将被执行的 JavaScript,告诉你成功或失败。
无法以这种方式进行 POST,src URL 必须是 GET,因此您可以通过这种方式传递参数。我不确定 WCF 是否有“仅获取”的访问方法。而且,由于浏览器会期望远程标记的结果是一个有效的 JavaScript 对象,因此您必须确保您的 WCF 服务也遵守这一点,否则您将收到 JavaScript 错误。
绕过跨站点脚本的另一种常用方法是为您的请求编写代理。换句话说,如果您想从 example.com 上托管的脚本访问域 test.com,则在 example.com 上创建一些 URL,以正确的方式将请求代理到 test.com。
对于您的示例,假设 WCF 没有自己的跨站点脚本限制,代理可能是正确的答案。
【讨论】:
您是否有机会使用 jQuery? jQuery 支持使用“JSONP”的跨域 JSON 请求。您将仅限于 GET 请求,但我已经尝试过了,效果很好!开始工作也非常简单。
有关详细信息,请参阅此页面上的“跨域 getJSON(使用 JSONP)”部分: http://docs.jquery.com/Release:jQuery_1.2/Ajax
以下是 JSONP 的一些背景知识: http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/
告诉我进展如何!
【讨论】:
新的 W3C 建议正在标准化,以允许受信任方之间通过 Access Control for Cross-Site Requests 规范进行跨站点请求。
这需要一个服务于合适的访问控制 HTTP 标头的服务器和一个能够理解这些标头并对其进行操作的浏览器。
简而言之,如果远程主机说它喜欢您的域,并且浏览器理解这意味着什么,那么您可以针对该主机执行 xmlHttpRequests,而不管同源策略如何。
目前很少有浏览器支持此功能。 IE8 显然可以(我还没有测试过),而 Firefox 3.1 可以(我已经对此进行了广泛的测试)。我希望其他浏览器能很快效仿。
您不应该期望最早在 2012 年之前充分采用兼容的浏览器。
这是问题的最终解决方案。缺点是要等几年才能在主流应用中使用。
如果这是在您完全控制的环境中使用,例如用于您可以确定使用哪个浏览器以及您可以配置多个服务器以发出正确标头的 Intranet,则它可以完美运行。
【讨论】:
为了扩展 Ben 的答案...我扩展了我们的 WCF 服务以支持来自 jQuery 的 JSONP 调用,使用类似于 Microsoft 的这个示例的代码:
【讨论】: