3

是否可以使用 Javascript 对 WCF 服务进行跨站点调用?

我不介意它是 POST 还是 GET。

但是我听说这些天来,浏览器不允许使用 POST 或 GET 进行跨站点调用。

我怎样才能绕过这个并仍然调用WCF 服务

4

4 回答 4

5

要绕过浏览器的跨站点脚本拦截器,您无能为力。这些阻止程序阻止 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 没有它自己的跨站点脚本限制。

于 2009-02-17T06:04:50.750 回答
4

您是否有机会使用 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/

让我知道事情的后续!

于 2009-02-20T21:35:21.707 回答
2

新的 W3C 建议正在标准化,以通过跨站点请求的访问控制规范允许受信任方之间的跨站点请求

这需要一个服务于合适的访问控制 HTTP 标头的服务器和一个能够理解这些标头并对其进行操作的浏览器。

简而言之,如果远程主机说它喜欢您的域,并且浏览器理解这意味着什么,那么您可以针对该主机执行 xmlHttpRequests,而不管同源策略如何。

目前很少有浏览器支持此功能。IE8 显然可以(我还没有测试过),而 Firefox 3.1 可以(我已经对此进行了广泛的测试)。我希望其他浏览器能很快效仿。

你不应该期望最早在 2012 年之前充分采用兼容的浏览器。

这是问题的最终解决方案。缺点是要等几年才能在主流应用中使用。

如果这是在您完全控制的环境中使用,例如用于您可以确定使用哪个浏览器以及可以配置多个服务器以发出正确标头的 Intranet,则它可以完美运行。

于 2009-02-20T21:53:14.317 回答
1

为了扩展 Ben 的答案...我扩展了我们的 WCF 服务以支持来自 jQuery 的 JSONP 调用,使用类似于 Microsoft 的这个示例的代码:

http://msdn.microsoft.com/en-us/library/cc716898.aspx

于 2009-02-20T21:37:24.010 回答