IE8/9中带有jQuery和XDomainRequest的CORS

IE8/9中带有jQuery和XDomainRequest的CORS,jquery,internet-explorer-9,xdomainrequest,Jquery,Internet Explorer 9,Xdomainrequest,更新:我强烈建议不要在XDomainRequest上投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只对非ssl服务器的GET请求有效,所以您也可以使用jsonp或其他什么 我正在使用CORS调用跨域API,但Internet Explorer出现了一些问题。CORS应该可以通过XDomainRequest对象在IE8和IE9中实现,但是我无法让它正常工作 JQuery将为XDomainRequest提供本机支持,但是建议使用几个JQuery插件来添加此支持。这表明有两个这样的插

更新:我强烈建议不要在XDomainRequest上投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只对非ssl服务器的GET请求有效,所以您也可以使用jsonp或其他什么


我正在使用CORS调用跨域API,但Internet Explorer出现了一些问题。CORS应该可以通过
XDomainRequest
对象在IE8和IE9中实现,但是我无法让它正常工作

JQuery将为XDomainRequest提供本机支持,但是建议使用几个JQuery插件来添加此支持。这表明有两个这样的插件:和,据报道这两个插件可以工作。好的,插件应该自动覆盖
jQuery.ajax
的行为。我找到了另一个插件

我放了一个小的演示页面,其中包含了相应的插件,并向启用CORS的服务器执行ajax请求。这些页面在Chrome和Firefox中工作,但是IE8/9会立即抛出一个权限拒绝错误(甚至在发出请求之前)。这建议添加另一个处理程序
xhr.onprogress=function(){}但是我试过了,它也不起作用

有什么线索表明我做错了什么吗?我还使用MS virtual server测试了IE8,但它也有完全相同的问题

编辑:好的,所以我发现问题的一部分是我在HTTPS上使用POST。显然,XDomainRequest不允许通过HTTPS进行CORS。我可以切换到HTTP,但我真的需要POST


编辑2:请看这个故事的结尾。事实证明,当使用HTTPPOST时,xDomainRequest只能将请求体(参数)编码为
text/plain
。这几乎使它一文不值,因为每个人都使用
application/x-www-form-urlencoded
multipart/form data

POST方法是受支持的,要进行跨域https://请求,您的调用页面也需要通过https加载。这是我找到的最好的一篇文章,详细解释了XDomainRequest的这些和其他限制:


我编写了一个代理,如果使用IE9或更低版本,它将优雅地降级为代理。如果使用ASP.NET,则根本不必更改代码

解决方案分为两部分。第一个是一个jquery脚本,它与jQueryAjax处理挂钩。如果发出跨域请求且浏览器为IE:

$.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;
    }
});
$.ajaxPrefilter(函数(选项、原始选项、jqXhr){
如果(!window.CorsProxyUrl){
window.CorsProxyUrl='/corsproxy/';
}
//只代理那些请求
//标记为跨域请求的。
如果(!options.crossDomain){
返回;
}
if(getIeVersion()&&getIeVersion()<10){
var url=options.url;
options.beforeSend=函数(请求){
setRequestHeader(“X-CorsProxy-Url”,Url);
};
options.url=window.CorsProxyUrl;
options.crossDomain=false;
}
});
在web服务器中,您必须接收请求,从
X-CorsProxy-Url
http头获取值,然后执行http请求并最终返回结果


我的博客帖子:

对于IE8/9中的CORS请求,您可以使用jQuery插件

Microsoft为IE8提供免费虚拟图像,因此如果您有bandwith,您将能够获得它。(只是一个提示)有一个简单的技巧可以让jQuery CORS ajax在IE8中工作。。。我想你可以通过搜索相关问题的答案在StackOverflow上找到它。更多信息,请参阅更新的自述文件,包括一个正在运行的JSFIDLE示例:上面的链接应该是:这个问题来自2013年!DIE IE8/9。这是一篇好文章,有几个缺点。我过去曾多次提到过它。另一个经常出现的问题是:“请求的内容类型头只支持text/plain”text/plain限制使得这个对象毫无价值。微软方面的编程工作完全是浪费。至少对于JSON API这样的常见用例来说,这并不像听起来那么糟糕。web应用程序可以使用XDomainRequest以文本/普通格式发送JSON数据。服务器端逻辑只需要知道如何接受与该内容类型一起发送的JSON。由于CORS支持已经需要在服务器端进行一些更改,因此这并不需要太多额外的工作。这只是围绕相同的
XDomainRequest
方法的jQuery包装。它没有解决上述任何限制。