【问题标题】:Doing an AJAX request to a website that might be up, or might be down向可能已启动或已关闭的网站发出 AJAX 请求
【发布时间】:2009-08-07 23:29:20
【问题描述】:

我正在写一个小应用程序,用来监控几个网站的状态,主要只是报告哪些网站在线,哪些网站离线。

我目前将此代码作为 onreadystatechange 函数:

if(xmlhttp.readyState == 4) {
    if (xmlhttp.status == 200) {
        element(id).innerHTML = "Online";
    }
    else {
        element(id).innerHTML = "Offline";
    }
}

当网站在线时它可以正常运行,但是如果我在离线的网站上执行 AJAX 请求,它永远不会到达“else”块。我认为如果网站关闭,请求永远不会到达 readyState 4 ?

关于如何捕获对离线网站的 AJAX 请求有什么建议吗?

【问题讨论】:

  • 另一种方法是让隐藏的 IFRAME 指向每个页面,并在每个页面上放置 onload 和 onerror 事件处理程序。

标签: ajax


【解决方案1】:

您要做的是在特定时间后中止请求,即 超时。这是一篇应该有所帮助的文章:

Async Requests over an Unreliable Network

【讨论】:

  • 是的,我做了一些调查,当您对离线资源执行 AJAX 请求时,readyState 永远不会达到 4,它会一直保持在 1,直到您中止请求。
【解决方案2】:

IE8 的 XHR 对象支持 ontimeout 事件 (http://msdn.microsoft.com/en-us/library/cc197061(VS.85).aspx)

ReadyState=4 表示“已加载”,如果内容未加载,则不会发生这种情况。

【讨论】:

    【解决方案3】:

    我刚刚使用 Fiddler 进行了测试,它返回了 Status 502,Body 512

    【讨论】:

    • 是的,但是我的 else 块应该捕获任何不是 200 的东西。由于某种原因它没有
    • 如果服务器不可访问,代理会生成 502。如果没有代理,就没有 502。
    【解决方案4】:

    您可以检查标头是否存在 404 错误。

    【讨论】:

    • 您不会从停机服务器获得 404,因为服务器无法返回 404。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2020-06-19
    相关资源
    最近更新 更多