【问题标题】:XDomainRequest problemXDomainRequest 问题
【发布时间】:2011-06-11 23:34:26
【问题描述】:

我正在尝试对使用 XDomainRequest (IE8) 返回 json 的服务进行异步调用。问题是我总是得到一个错误(onerror 事件被触发,responseText 总是为空),我正在使用 fiddler 检查服务的响应,我看起来是正确的(我可以看到 json 对象返回),这仅在 IE8 中使用 XDomainRequest 时发生,在 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 .....

【问题讨论】:

    标签: javascript ajax xdomainrequest


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您的问题可能是发送的内容类型,因为 XDomainRequest 仅支持“text/plain”。

      参考: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

      干杯,

      安德烈·佩德罗索

      【讨论】:

        【解决方案3】:

        一年前的帖子,你还在吗?! 您正在调用 xdr.onsuccess 但我认为该方法不存在。 xdr.onload 有效,似乎相当于 jQuery 的 AJAX“成功”功能。

        这个 X-Domain 的东西很新,但是现在可以从 MS 那里获得一个非常好的工作模型:AJAX - Introducing Cross-domain Request (XDR)

        xdr.ontimeout 我无能为力,但还没有找到需要 :) 我首先使用 jQuery 启动并运行,现在使用 ie9 感谢 MS 的帖子。

        XDR 对我当前应用程序的计时有一些问题,只是使用超时来处理它:

        xdr.onload = setTimeout( function(){ doIt( xdr.responseText ), 2000});
        

        【讨论】:

        • 谢谢,这正是我需要的解决方案!
        • setTimeout 无济于事。实际问题是 IE8 可以在打开未决请求时对 XDomainRequest 进行垃圾收集。如果您查看您的 setTimeout 调用,您正在捕获 XDR 变量,该变量可以避免垃圾收集器稍长一些 - 只是解决问题。我在这里发布了解决方法的详细答案:stackoverflow.com/questions/8058446/…
        【解决方案4】:

        另一个问题是,如果您通过 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>
        

        【讨论】:

          猜你喜欢
          • 2013-09-08
          • 1970-01-01
          • 2016-08-13
          • 2014-09-28
          • 2012-01-17
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多