更新:我强烈建议不要在XDomainRequest中投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只适用于对非ssl服务器的GET请求,所以你不妨使用jsonp或其他。
我使用CORS来调用跨域API,但Internet Explorer提出了问题。通过XDomainRequest
对象在IE8和IE9中应该可以使用CORS,但是我无法使用它。
JQuery refuses为XDomainRequest提供本机支持,但是建议使用几个jQuery插件来添加此支持。这个topic提示了两个这样的插件:jQuery.XDomainRequest.js和xdr.js,据报道它们起作用。 Afaik,插件应该自动覆盖jQuery.ajax
的行为。我找到了另一个插件here。
我将一些演示页面与相应的插件jQuery.XDomainRequest和xdr以及jquery.ie.cors放在一起,对启用CORS的服务器执行ajax请求。这些页面在Chrome和Firefox中运行,但IE8 / 9会立即抛出权限被拒绝错误(甚至在发出请求之前)。这个MSDN post建议添加另一个处理程序xhr.onprogress = function() {};
,但我尝试了这个并且它也没有用。
任何线索我做错了什么?我现在也使用MS虚拟服务器测试IE8,但它有完全相同的问题。
编辑:好的,所以我发现问题的一部分是我通过HTTPS使用POST。显然XDomainRequest不允许通过HTTPS使用CORS。我可以切换到HTTP,但我真的需要POST。
Edit2:有关此故事的结尾,请参阅this issue on github。事实证明,当使用HTTP POST时,xDomainRequest只能将请求体(参数)编码为text/plain
。这几乎使它变得毫无价值,因为每个人都使用application/x-www-form-urlencoded
或multipart/form-data
。
答案 0 :(得分:28)
支持POST方法,并且要建立跨域https://请求,您的呼叫页面也需要通过https加载。这是我发现的最好的文章,它详细解释了XDomainRequest的这些和其他限制:
答案 1 :(得分:5)
我已经编写了一个代理,如果使用IE9或更低版本,它将优雅地降级到代理。如果使用ASP.NET,则根本不需要更改代码。
解决方案分为两部分。第一个是jquery脚本,它挂钩到jQuery ajax处理。如果发出了跨域请求并且浏览器是IE,它将自动调用Web服务器:
$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
if (!window.CorsProxyUrl) {
window.CorsProxyUrl = '/corsproxy/';
}
// only proxy those requests
// that are marked as crossDomain requests.
if (!options.crossDomain) {
return;
}
if (getIeVersion() && getIeVersion() < 10) {
var url = options.url;
options.beforeSend = function (request) {
request.setRequestHeader("X-CorsProxy-Url", url);
};
options.url = window.CorsProxyUrl;
options.crossDomain = false;
}
});
在您的Web服务器中,您必须接收请求,从X-CorsProxy-Url
http标头获取值并执行HTTP请求,最后返回结果。
我的博文:http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
答案 2 :(得分:0)
对于IE8 / 9中的 CORS 请求,您可以使用jQuery插件jquery-transport-xdr