我有一个经典的ASP Web应用程序,它打算在99%的时间内离线运行(在没有互联网服务的农村地区(。
当应用程序确实连接到互联网时,它会提醒用户,以便他/她/他们可以将数据与 Web 应用程序的在线版本同步。
我有一个检测功能,当有互联网服务时效果很好,可以立即检测互联网。
'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"页面"并通过相同的异步 JS 方法调用它。
更长的解释:我假设此代码在本地服务器上运行,由用户浏览器启动,可能作为每个ASP页面文件"顶部"的包含。您希望尝试从页面生成中删除任何长时间运行的 ASP 代码,因为每个小的处理延迟都会损害感知的性能。
在这种情况下,您只需检查互联网连接是否可用并通知用户。您可以使用嵌入到发送到浏览器的每个页面的头部的普通JS函数来执行此操作,并且完全避免了使用此函数的ASP的需要。只需使JS异步尝试访问基于互联网的服务器即可。如果你得到200,那么互联网就启动了,如果是400或类似的,那么它就关闭了。
如果你绝对"必须"坚持使用ASP,那么你可以将此函数提升到单独的ASP文件中,并使用相同的JS异步技术来调用它,使ASP无会话,并包含
<%@ ENABLESESSIONSTATE=False %>
在文件的顶部。对基于会话的 ASP 页的请求在顺序队列中运行,因此无会话会阻止此请求阻塞队列。
摘要 - 让服务器从ASP的"每=页"流中签出,理想情况下将其全部从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