【问题标题】:Timeout an internet-connectivity check超时互联网连接检查
【发布时间】:2019-10-01 16:15:06
【问题描述】:

我有一个经典的 ASP 网络应用程序,旨在 99% 的时间离线运行(在没有互联网服务的农村地区)。

当应用确实连接到互联网时,它会提醒用户,以便他/她/他们可以与网络应用的在线版本同步数据。

我有一个检测功能,在有网络服务的时候效果很好,立即检测到网络。

'CHECK FOR AN INTERNET CONNECTION
    WITH CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://xxx.xxxx-xxxxx.org", FALSE
        .SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"
        ON Error RESUME NEXT
        .Send
        IF .waitForReponse(2) THEN
            IF .Status = 200 THEN 
                strOnline = "Y"
            ELSE
                strOnline = "N"
            END IF 
        ELSE
            strOnline = "N"
        END IF
    END WITH
END IF 

问题是,当没有互联网服务时,脚本会在加载前使页面挂起大约 12 秒。

正如您在上面看到的,我尝试将检查包含在 .WaitForResponse() 中,但它似乎没有任何效果。

如果在前 1 或 2 秒内未找到互联网,我该怎么做才能取消连接检查?

【问题讨论】:

  • 我已将“IF .WaitForResponse(2) THEN”更改为“IF ERR.NUMBER 0 THEN”,页面加载速度稍快(7 秒对 12 秒)。不过,这不是我正在寻找的解决方案。如果它在不到 2 秒内没有得到响应,我希望它只是超时。

标签: asp-classic timeout freeze connectivity internet-connection


【解决方案1】:

这不是让代码运行得更快的完美答案。相反,它是更好的长期解决方案的替代方案。

TLDR:将此检查纳入普通浏览器端异步 JS 函数,或使用无会话的 ASP“页面”并通过相同的异步 JS 方法调用它。

更长的解释:我假设此代码在本地服务器上运行,由用户浏览器启动,可能作为每个 ASP 页面文件“顶部”的包含。您想尝试从页面构建中删除任何长时间运行的 ASP 代码,因为每个小的处理延迟都会损害感知的性能。

在这种情况下,您只是检查互联网连接是否可用并通知用户。您可以使用嵌入到您发送到浏览器的每个页面的头部的普通 JS 函数来完成此操作,并且完全无需使用 ASP 来完成此功能。只需让 JS 异步尝试访问基于 Internet 的服务器。如果您获得 200 则互联网已启动,如果其为 400 或类似则其已关闭。

如果您绝对“必须”坚持使用 ASP,那么您可以将此函数提升到单独的 ASP 文件中,并使用相同的 JS 异步技术来调用它,从而通过包含

使 ASP 无会话
<%@ ENABLESESSIONSTATE=False %>

在文件的顶部。对基于会话的 ASP 页面的请求在顺序队列中运行,因此无会话会阻止此请求阻塞队列。

总结 - 让服务器从 ASP 的“每页”流中检查出来,理想情况下将它从 ASP 中全部取出并使其成为纯 JS。

【讨论】:

  • 非常感谢您冗长的回复。我真正想要摆脱互联网连接检查的是能够将 VBS 变量 strOffiline 设置为“Y”或“N”。我怎么能用 JS 异步请求做到这一点?
【解决方案2】:

经过大量实验,我找到了一个我喜欢的解决方案,并且经受住了重大的压力测试:

strOnline = "N"
    Const WAIT_TIMEOUT = 2
    Dim http
    Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
        http.open "POST", "http://172.217.4.132", TRUE 'async request
        http.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"
        http.send 
        IF ERR.NUMBER <> 0 THEN
            strOnline = "N"
        ELSE
            IF http.waitForResponse(WAIT_TIMEOUT) THEN 'response ready
                strOnline = "Y"
            ELSE 'wait timeout exceeded
                strOnline = "N" 
            END IF
        END IF 
    SET http = NOTHING

我真诚地希望这对其他人有所帮助。干杯,N

【讨论】:

  • 显着的变化似乎是您从 HTTP GET 动词切换到 POST。正确吗?
  • 还有我从“MSXML2.XMLHTTP”切换到“MSXML2.ServerXMLHTTP”
  • 好的 - 除了时间效应之外,还有什么区别?
  • 时间效应是指谁。我的旧脚本在确定是否有互联网连接方面非常迅速,但在确定没有互联网连接之前会挂起 12 秒。我需要消除这种滞后。
  • 当然 - 我想知道时间减少是否是由于使用 POST 或切换到 MSXML2.ServerXMLHTTP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2011-04-15
  • 2017-03-16
  • 2014-02-08
  • 2012-06-12
相关资源
最近更新 更多