超时互联网连接检查

Timeout an internet-connectivity check

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

当应用确实连接到 Internet 时,它会提醒用户,因此 he/she/they 可以与在线版本的网络应用同步数据。

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

'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 秒内找不到互联网,我该如何取消连接检查?

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

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

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

在这种情况下,您只是检查互联网连接是否可用并通知用户。您可以通过将纯 JS 函数嵌入到您发送给浏览器的每个页面的头部来完成此操作,并且完全避免需要为此函数使用 ASP。只需让 JS 异步尝试访问基于 Internet 的服务器即可。如果您得到 200,则互联网正常,如果它是 400 或类似的,则互联网中断。

如果你绝对 'have' 坚持 ASP,那么你可以将这个函数提升到单独的 ASP 文件中,并使用相同的 JS 异步技术来调用它,使 ASP 包含

的无会话
<%@ ENABLESESSIONSTATE=False %>

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

总结 - 让服务器从 ASP 的 'every=page' 流中检出,理想情况下将其从 ASP 中全部检出并使其成为纯 JS。

经过大量实验,我找到了一个我喜欢的解决方案,它经得起重大压力测试:

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