【发布时间】:2015-01-02 01:41:24
【问题描述】:
我正在开发一个必须支持 IE10 的 Angular Web 应用程序。我需要对我们的企业 salesforce 服务器进行跨域调用。在 chrome(我们不正式支持,但我们都在其中进行开发)中,该调用失败,因为 chrome 将 OPTIONS 预检调用发送到不支持 CORS 的 salesforce 服务器。
但是,IE 不会进行 CORS 预检,所以我认为进行此调用不会有任何问题。但我收到“拒绝访问”。从 Angular 代码深处抛出的错误。
进一步挖掘显示,失败的 angular (v1.2.21) 中的特定行是:
xhr.open(method, url, true); (on line 8544 if you happen to have version 1.2.21).
在查看github、google groups 和stack overflow 线程时,我发现问题可能出在 IE 想要处理跨域请求的方式上,特别是调用哪个 xhr 对象来进行调用。
似乎旧版本的 Angular 存在此问题,但已通过在 xhr.open() 调用之前添加一个函数来为正在运行的 IE 版本检索正确的 XMLHttpRequest 对象来解决:
var xhr = createXhr(method);
xhr.open(method, url, true);
forEach(headers, function(value, key) {
if (isDefined(value)) {
xhr.setRequestHeader(key, value);
}
});
所以理论上,正确的 xhr 对象是调用了它的 .open() 方法。但是对我来说,该行会引发“访问被拒绝”错误。
在上面的链接中,似乎通常建议不要使用XMLHttpRequest 对象进行跨域调用,而必须使用XDomainRequest()。考虑到有角度的人不太可能错过这一点,我还是尝试了,只是手动更改 angular.js 文件中的代码以返回该对象以用于我们特定的销售人员调用:
var xhr;
if (url.indexOf("salesforce.com") > -1) {
xhr = new XDomainRequest();
}
else {
xhr = createXhr(method);
}
xhr.open(method, url, true);
forEach(headers, function(value, key) {
if (isDefined(value)) {
xhr.setRequestHeader(key, value);
}
});
除了现在代码尝试调用xhr.setRequestHeader(key, value) 的行失败。有谁知道问题是什么?我很难相信 Angular 没有办法处理 IE 中的跨域调用,所以我想我只是遗漏了一些东西。
【问题讨论】:
-
你在混合http和https吗?
-
@epascarello 是的。我们的地址是
http://...,销售人员地址是https://...但是,如果我将他们的地址更改为http,我仍然会遇到同样的问题。访问被拒绝,实际上没有致电 salesforce。 -
@tengen 看起来像是一个普通的 CORS 问题。如果没有 CORS 支持,您将无法向所述服务器发送 xhr 请求。
-
@epascarello 该链接很容易成为我见过的对 CORS 的最佳、最易读的解释,而且我也看到了我的公平份额。谢谢! +1!我在文章中看到了一个更新:更新:Internet Explorer 10 现在支持使用 XMLHTTPRequest 的 CORS,这应该比现在已弃用的 XDomainRequest 对象更受欢迎。 这解释了为什么 XDomainRequest 对我来说不是问题在 IE10 中。但即使我对 HTTP 进行 GET 调用(删除那篇文章中 #7 中的问题...混合 http/https 请求)我仍然遇到同样的问题。
标签: javascript ajax angularjs cors internet-explorer-10