我有一些Ajax代码可以在Safari,Chrome和Firefox中使用,但在IE9中却没有。
页面位于http://foo.com/test.aspx
,它正在向https://service.foo.com
上托管的网络服务发出AJAX请求。我以为我不会有任何跨域问题,但鉴于IE9阻止了它,我似乎做了:(
var tempUrl = "https://service.foo.com/dummy.svc/test?hi=bye";
$.get(tempUrl, "html");
正如我所提到的,代码在其他3个浏览器中运行,而不是IE9。 (我只关心IE9,而不是IE8或更旧版本。)
我做了一些挖掘,并在MSDN上发现this article说:
跨域请求需要相互 网页和网页之间的同意 服务器。你可以发起一个 您网页中的跨域请求 通过创建XDomainRequest对象 关闭窗口对象并打开一个 与特定域的连接。该 浏览器将从中请求数据 域的服务器通过发送Origin 带有原点值的标题。 它只会完成连接 如果服务器响应 Access-Control-Allow-Origin标头 要么*或者确切的URL 请求页面。这种行为是一部分 万维网联盟 (W3C)的Web应用程序工作 客户端的集团框架草案 跨域通信即 XDomainRequest对象与。
集成
在我走下使用XDR的道路之前,我想与比我更聪明的人验证这是否是正确的方法。
Response.AddHeader("Access-Control-Allow-Origin", "*");
添加到我的页面$.get
的常规jquery调用。 我是完全离开还是这是正确的方法?
(假设这是正确的方法,Acecss-Control-Allow-Origin
响应标题位于http://foo.com/test.aspx的网页上或https://service.foo.com的网络服务上?)
答案 0 :(得分:10)
使用此自定义代码代替$.ajax()
:
function newpostReq(url,callBack)
{
var xmlhttp;
if (window.XDomainRequest)
{
xmlhttp=new XDomainRequest();
xmlhttp.onload = function(){callBack(xmlhttp.responseText)};
}
else if (window.XMLHttpRequest)
xmlhttp=new XMLHttpRequest();
else
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
callBack(xmlhttp.responseText);
}
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
注意:这适用于GET请求。
要在POST请求中进行调整,请更改以下行:
function newpostReq(url,callBack,data)
数据是帖子请求的URL编码参数,例如:key1 = value1& key2 = value%20two
xmlhttp.open("POST",url,true);
try{xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");}catch(e){}
xmlhttp.send(data);
总结一下,打开连接作为POST请求(第1行),设置postlen数据的urlencoded类型的请求标头(用特殊浏览器的try-catch包装)(第2行),然后发送数据(Line 3)。
答案 1 :(得分:1)
我刚刚解决了同样的问题。
php后端,正确的mime,是的,
header('Access-Control-Allow-Origin: *');
几乎*每个浏览器都有效 - 除了IE9。
似乎jQuery.getJSON不会自动为ie9执行XDR - 在同一个域上创建服务代理后,它可以工作。
*几乎 - 歌剧也起作用。
编辑:好吧,歌剧确实和ie9有同样的问题。现在就像一个魅力。
注意:chrome,safari和firefoxes(3.6-5)对使用ACAO的跨域请求没有问题:*。
我不明白为什么a)microsoft使用不同的对象进行跨域请求,以及b)为什么jquery不会透明切换(或者至少提供一个选项选项)。
答案 2 :(得分:0)
如果这在其他浏览器(支持CORS)中有效,那么你的SVC似乎已经支持这个了,但是可以肯定的是,使用Fiddler2看看发生了什么。
Access-Control-Allow-Origin
标头用于请求的资源,而不是请求它的页面。