跨域请求(XDomainRequest)问题

8
我正在尝试使用XDomainRequest(IE8)对返回JSON的服务进行异步调用。问题是我总是收到错误(触发onerror事件,responseText始终为null)。我使用Fiddler检查服务的响应,看起来没问题(我可以看到JSON对象返回),但只有在使用XDomainRequest时才会在IE8中出现此问题,在JQuery中实现相同的功能正常工作。如果您有任何线索,将不胜感激。谢谢!P.S.:这是我的javascript代码:
.....
  if (jQuery.browser.msie && window.XDomainRequest) {
    //Use Microsoft XDR
    var xdr = new XDomainRequest();
    xdr.open("post", url);
    xdr.onload = function () {
       alert("Loading");
       alert(xdr.responseText);
    };
    xdr.onsuccess = function() {
       alert("Success!");
       alert(xdr.responseText);
    };
    xdr.onerror = function() {
       alert("Error!");
       alert(xdr.responseText);
    };
    xdr.onprogress = function() {
       alert("Progress");
       alert(xdr.responseText);
    };
    xdr.timeout = 1000;
    xdr.send("data: " + escape(data));
    var response = xdr.responseText;
 } else .....
4个回答

8

你确定该服务正在发送一个与请求的URL匹配的Access-Control-Allow-Origin头吗?


7

4
一年前的帖子,你还在吗GiaNU?! 你调用了xdr.onsuccess,但我认为这个方法不存在。 xdr.onload工作正常,似乎相当于jQuery的AJAX “success”函数。
这个X-Domain的东西很新,但现在有一个非常好的可用模型来自MS: AJAX - Introducing Cross-domain Request (XDR) xdr.ontimeout我不能让它做任何事情,但目前没有发现需要它 :) 我首先使用jQuery和ie9启动并运行了我的内容,感谢MS的文章。
对于我的当前应用程序,XDR的时机存在一些问题,并且只是使用超时来处理它。
xdr.onload = setTimeout( function(){ doIt( xdr.responseText ), 2000});

谢谢,这正是我所需的解决方案! - markyd13
1
setTimeout不会有所帮助。实际问题是,当IE8有一个挂起的请求时,它可以垃圾回收XDomainRequest。如果您查看setTimeout调用,您正在捕获XDR变量,这可以稍微避免垃圾收集器-只是将问题移动了一下。我在这里发布了一个详细的答案和解决方法:https://dev59.com/82sz5IYBdhLWcg3wNE5q - ShadowChaser

1

另一个需要注意的是,如果您正在通过Cassini运行服务,则不会返回“Access-Control-Allow-Origin”标头,因为Cassini无法识别此标头。我们曾经遇到这样一种情况:我们的服务调用在测试服务器上工作,但在本地却无法工作。原来服务是在我们的本地开发机上通过Cassini托管的,而在测试服务器上则是通过IIS托管的。

此外,以下是web.config设置,供需要的人使用(请注意:这允许从任何域访问 -“*”):

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接