为什么这个跨域请求在其他浏览器中有效但在IE9中无效?

时间:2011-06-22 05:23:58

标签: ajax cross-domain internet-explorer-9

我有一些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的道路之前,我想与比我更聪明的人验证这是否是正确的方法。

  1. Response.AddHeader("Access-Control-Allow-Origin", "*");添加到我的页面
  2. 创建条件jscript代码,检测IE9并使用XDR而不是我正在使用$.get的常规jquery调用。
  3. 我是完全离开还是这是正确的方法?

    (假设这是正确的方法,Acecss-Control-Allow-Origin响应标题位于http://foo.com/test.aspx的网页上或https://service.foo.com的网络服务上?)

3 个答案:

答案 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标头用于请求的资源,而不是请求它的页面。