63

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


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

JQuery拒绝为 XDomainRequest 提供本机支持,但是建议使用几个 jQuery 插件来添加此支持。本主题建议使用两个这样的插件:jQuery.XDomainRequest.jsxdr.js,据报道它们可以工作。Afaik,插件应该自动覆盖jQuery.ajax. 我在这里找到了另一个插件。

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

任何线索我做错了什么?我现在也使用 MS 虚拟服务器对 IE8 进行了测试,但它有完全相同的问题。

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

Edit2:请参阅github上的此问题以了解此故事的结尾。事实证明,当使用 HTTP POST 时,xDomainRequest 只能将请求正文(参数)编码为text/plain. 这几乎使它一文不值,因为每个人都使用application/x-www-form-urlencodedor multipart/form-data

4

3 回答 3

29

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

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

于 2012-08-24T11:24:25.893 回答
5

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

解决方案分为两部分。第一个是一个 jquery 脚本,它与 jQuery ajax 处理挂钩。如果发出跨域请求并且浏览器是 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;
    }
});

在您的 Web 服务器中,您必须接收请求,从X-CorsProxy-Urlhttp 标头获取值并执行 HTTP 请求并最终返回结果。

我的博文:http: //blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

于 2014-04-24T11:04:56.450 回答
0

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

于 2015-10-06T20:18:49.160 回答