是否可以在Javascript中对WCF服务进行跨站点调用?
我不介意它是POST还是GET。
但我听说现在浏览器不允许使用POST或GET进行跨站点调用。
如何绕过这个并仍然调用 WCF服务?
答案 0 :(得分:5)
你无法绕过浏览器的跨网站脚本拦截器。这些阻止程序阻止XMLHTTPRequest发生到任何域,但加载包含脚本或页面的域。
也就是说,有一种常用的解决方法:使用JavaScript在DOM中编写一个新条目,引用一个跨站点URL的src。您将所有RPC方法参数传递给此“脚本”,该脚本将返回将要执行的一些JavaScript,告诉您成功或失败。
以这种方式无法进行POST,src URL必须是GET,因此您可以通过这种方式传递参数。我不确定WCF是否有“仅限GET”访问方法。并且,由于浏览器希望远程标记的结果是有效的JavaScript对象,因此您必须确保您的WCF服务也遵守该标准,否则您将收到JavaScript错误。
绕过跨站点脚本的另一种常用方法是为您的请求编写代理。换句话说,如果要从example.com上托管的脚本访问域test.com,请在example.com上创建一些URL,以适当的方式将请求代理到test.com。
对于您的示例,代理可能是正确答案,假设WCF没有自己的跨站点脚本限制。
答案 1 :(得分: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/
让我知道它是怎么回事!
答案 2 :(得分:2)
新的W3C建议正在标准化,以允许通过Access Control for Cross-Site Requests规范在受信任方之间进行跨站点请求。
这需要服务器提供合适的Access Control HTTP标头和能够理解并对此类标头采取行动的浏览器。
简而言之,如果远程主机表示它喜欢您的域,并且浏览器了解这意味着什么,则无论相同的源策略如何,您都可以对该主机执行xmlHttpRequests。
目前很少有浏览器支持此功能。 IE8显然(我还没有测试过)和Firefox 3.1(我已经对它进行了广泛的测试)。我希望其他浏览器能够很快跟进。
您最好在2012年之前预计不会充分采用兼容的浏览器。
这是问题的最终解决方案。缺点是等待几年才能在主流应用中使用。
如果要在您完全控制的环境中使用,例如您可以确定使用哪个浏览器的Intranet以及可以配置多个服务器以发出正确标头的位置,则它可以正常运行。
答案 3 :(得分:1)
扩展Ben的答案......我扩展了我们的WCF服务以使用类似于Microsoft的此示例的代码来支持来自jQuery的JSONP调用: