我正在尝试从多个域向一个将处理请求的域进行 AJAX 调用。通过在处理服务器上设置标头很容易在 Firefox 和 Chrome 中启用跨域:
header("Access-Control-Allow-Origin: *");
但这无助于在 Internet Explorer 中启用它。当我尝试:
httpreq.send('');
它以错误访问被拒绝而停止。
如何在 Internet Explorer 中启用此功能?
我正在尝试从多个域向一个将处理请求的域进行 AJAX 调用。通过在处理服务器上设置标头很容易在 Firefox 和 Chrome 中启用跨域:
header("Access-Control-Allow-Origin: *");
但这无助于在 Internet Explorer 中启用它。当我尝试:
httpreq.send('');
它以错误访问被拒绝而停止。
如何在 Internet Explorer 中启用此功能?
自从我第一次在 IE7 及更高版本中发布我的 CORS 解决方案以来,发生了很大变化。首先,jQuery 属性 $.support.cors 默认为 true,.NET 框架 4.0 及更高版本不再支持在 3.5.1 及更低版本中实现的 CORS。在使用 ASP.NET 4.0 编写 Web 服务时,我安装了 Thinktecture.IdentityModel,它可以作为 NuGet 包使用。然后,在 Global.asax 文件的 Application_Start 方法中,添加:
void Application_Start(object sender, EventArgs e)
{
Thinktecture.IdentityModel.Http.Cors.IIS.UrlBasedCorsConfiguration.Configuration
.ForResources("*")
.ForOrigins("http://localhost:80, http://mydomain")
.AllowAll()
.AllowMethods("GET", "POST");
}
现在在 system.webServer 中添加 httpProtocol 元素:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept, X-Requested-With, X-File-Name" />
<add name="Access-Control-Allow-Methods" value="GET, POST" />
</customHeaders>
</httpProtocol>
我的 $.ajax 调用现在是:
$.ajax({
url: serviceUrl,
data: JSON.stringify(postData),
type: "POST",
cache: false,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: onSuccess,
error: onError
});
我不相信您可以直接在 Internet Explorer 中执行此操作。你有几个选择:
在您控制的可以转发 Ajax 请求的服务器上设置代理转发脚本。确保它只转发到您需要的适当目的地,以免您变成匿名中继。
使用document.domain
技巧。基本上,您需要创建一组iframe
s,一个用于您需要进行 Ajax 调用的每个服务器。在每个iframe
集合中,document.domain
属性与您需要将 Ajax 请求发送到的域完全匹配。至于如何填充必要的数据,请在设置之前使用 DOM 操作document.domain
。请注意,此技巧要求目标服务器位于原始服务器的子域中。本文中的更多内容,带有示例。
我让 IE8 和 9 只使用 jQuery $.ajax(jQuery 版本 1.7.2)
jQuery.support.cors = true;
jQuery(function() {
$.ajax({
crossDomain : true,
dataType: 'html',
//...
});
});
对于 Internet Explorer 8,您需要对 FF3 执行类似操作,即使用“Access-Control-Allow-Origin”标头并使用 XDomainRequest 对象而不是 XMLHttpRequest。此处对 IE8 进行了详细说明:http: //msdn.microsoft.com/en-us/library/dd573303%28VS.85%29.aspx
旧版本的 IE 不支持跨站点访问控制也不支持 XDomainRequest 对象。但是还没有结束,您可以使用 IFrame 技巧,例如,创建一个不可见的 IFrame 来调用您的函数,如下所述:http: //softwareas.com/cross-domain-communication-with-iframes
只需添加到 Eric 的答案,对于旧版本的 IE,您可以使用 Jquery 1.4.2 的 $.ajax 方法,默认情况下允许跨域请求,或者对于跨域 JSON,您可以使用
jQuery.getJSON(String url, Map data, Function callback) 返回 XMLHttpRequest
Jquery 文档的摘录。
“jQuery 现在原生支持 JSONP - 如果您尝试从远程 URL 加载 JSON(通过 $.getJSON 或 $.ajax),那么将为服务器提供额外的回调来解释。”