【问题标题】:XDomainRequest - not calling...not doing anythingXDomainRequest - 不调用...不做任何事情
【发布时间】:2023-04-08 02:28:01
【问题描述】:

我有一个问题...我使用 jQuery ajax 调用返回 XML 的 Web 服务。 jQuery ajax 的东西对除了 ie 之外的所有浏览器都非常有用。

所以对于 ie 浏览器,我使用的是 XDomainRequest。代码如下:

if ($.browser.msie && window.XDomainRequest) {
    // Use Microsoft XDR
    var xdr = new XDomainRequest();
    xdr.open("get", theUserUrl);
    xdr.timeout = 95000;
    xdr.onerror = function () {
        console.log('we have an error!');
    }
    xdr.onprogress = function () {
        console.log('this sucks!');
    };
    xdr.ontimeout = function () {
        console.log('it timed out!');
    };
    xdr.onopen = function () {
        console.log('we open the xdomainrequest');
    };
    xdr.onload = function () {
        // XDomainRequest doesn't provide responseXml, so if you need it:
        var xml2 = new ActiveXObject("Microsoft.XMLDOM");
        xml2.async = false;
        xml2.loadXML(xdr.responseText);
        console.log('do we get any response text at all?: ' + xdr.responseText);
        ParseOwnershipObjects(xml2);
        //AddServiceRequestsToMap(xml2, map, spinner);
    };
    xdr.send();
}
  • 这个确切的代码可以在应用程序的其他地方正常工作 不同的网址。

    网址很好,它返回的正是浏览器中的内容 (以及为什么 jquery ajax 调用有效)。几件事 注意:

    我正在将我自己的 html/javascript 与另一个人的 asp.net 集成 项目。

global.asax.cs 文件中,我有:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET,OPTIONS");
}

所以我认为这不是标题问题。

我的处理程序都没有触发。不是onprogress、ontimeout、onerror……什么都没有! 我没有时间将 Web 服务转换为 JSON。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: javascript asp.net internet-explorer xdomainrequest


    【解决方案1】:

    免责声明 - 我实际上没有使用过“XDomainRequest” - 在使用 jQ 时,我将数据设置为 jsonp 用于 xdomain 请求...

    调试时 - 您是否使用 IE 开发工具 (F12)?如果不是,错误很可能是console.log

    编辑: 过失,忽略jsonp的东西-错过了你提到的部分XML


    更新:

    出于好奇,我正在尝试XDomainRequest。我复制了您的代码,并为theUserUrl 添加了一个值。

    • 如上/预期,除非我运行 Internet Explorer 开发人员工具,否则consoleundefined - 并且可能给人以“您的处理程序都没有触发”的印象。

    • 一旦我启用了 IE 开发工具(停靠或其他方式)xdr.onerror 就会触发。 we have an error 登录到 IE 控制台。因此,当存在错误时,处理程序确实触发。

    快速阅读XDomainRequest 需要响应 服务器具有Access-Control-Allow-Origin 标头。我正在调用我自己的服务器,并且我知道我没有设置此标头,因此无需进一步调试,可以很好地猜测这就是 xdr.onerror 被解雇的原因。

    【讨论】:

    • 感谢您的回复。我一直在使用 F12,特别是控制台。当我将开发工具留在窗口中时,每当我打开测试页面(即localhost:28730/Test.aspx)时,它总是会使开发工具崩溃(因为它会关闭窗口)。当我将开发工具停靠在浏览器窗口中时,我没有得到任何输出。我还注释掉了所有 console.log 命令,但无济于事。
    • 谢谢。我不认为控制台与它有任何关系,因为我多次将它们注释掉并且一直在运行开发者工具。不过,感谢您的帮助。我很感激!
    【解决方案2】:

    事实证明,XDomainRequest 对象未正确处理 url 参数中的特殊字符。而不是 GET 请求,我将在 Internet Explorer 查询中使用 POST 请求。

    编辑 - 我最终将 Web 服务切换为以 JSON 格式返回输出,从而消除了对 XDomainRequest 的需求。使用 JSON 也可以加快速度,我推荐它!

    【讨论】:

    • 您能否说明更改响应格式如何消除对 XDomainRequest 的需求?它仍然是跨域的,对吗?
    • 使用 JSON 可以让您在特定于 IE 的情况下避免使用 XDomainRequest 对象,并为所有事情使用 jQuery ajax。跨域问题消失了。查看此答案以获取有关将 JSON 与 jquery Ajax 一起使用的更多详细信息:stackoverflow.com/a/8894013/575861
    猜你喜欢
    • 2017-08-11
    • 2011-04-22
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多