我正在尝试从几个域进行AJAX调用,以便处理请求。通过在处理服务器上设置标题,可以轻松在Firefox和Chrome中启用跨域:
header("Access-Control-Allow-Origin: *");
但这无助于在Internet Explorer中启用它。当我尝试:
httpreq.send('');
它因访问被拒绝而停止。
如何在Internet Explorer中启用它?
答案 0 :(得分:12)
自从我第一次在IE7及更高版本中发布CORS解决方案以来,已经发生了很大的变化。首先,jQuery属性$ .support.cors默认为true,.NET frameworks 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
});
答案 1 :(得分:5)
我不相信你可以直接在Internet Explorer中这样做。你有几个选择:
在您控制的可以转发Ajax请求的服务器上设置代理转发脚本。确保它只转发到您需要的适当目的地,这样您就不会变成匿名中继。
使用document.domain
技巧。基本上,您需要创建一组iframe
,一个用于调用Ajax所需的每个服务器。在每个iframe
内设置document.domain
属性以完全匹配将Ajax请求发送到所需的域。至于如何填充必要的数据,请在设置document.domain
之前使用DOM操作。请注意,此技巧要求目标服务器位于原始服务器的子域中。 this article中的更多内容,以及示例。
答案 2 :(得分:3)
我让IE8和9只使用jQuery $ .ajax(jQuery版本1.7.2)
jQuery.support.cors = true;
jQuery(function() {
$.ajax({
crossDomain : true,
dataType: 'html',
//...
});
});
答案 3 :(得分:1)
对于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
答案 4 :(得分:0)
只是添加到Eric的答案,对于旧版本的IE,您可以使用Jquery 1.4.2的$ .ajax方法,默认情况下允许跨域请求,或者对于跨域JSON,您可以使用
jQuery.getJSON(String url,Map data,Function callback)返回XMLHttpRequest
摘自Jquery文档。
“jQuery现在本身支持JSONP - 如果您尝试从远程URL加载JSON(通过$ .getJSON或$ .ajax),那么将提供额外的回调以供服务器解释。”