我有一个Classic ASP Web应用程序,该应用程序可以在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
问题在于,当没有Internet服务时,脚本会使页面在加载之前挂起大约12秒钟。
正如您在上面看到的,我尝试将支票放在.WaitForResponse()中,但似乎没有任何作用。
如果在开始的1或2秒钟内没有找到互联网,我该怎么做才能取消连接检查?
答案 0 :(得分:1)
这不是使代码运行更快的完美答案。相反,它是更好的长期解决方案的替代方法。
TLDR:使此检查进入普通的浏览器端异步JS函数,或使用无会话的ASP'页面',并通过相同的异步JS方法调用它。
更长的解释:我认为这段代码正在本地服务器上运行,由用户浏览器启动,可能是每个ASP页文件的“顶部”中的包含内容。您希望尝试从页面构建中删除所有长时间运行的ASP代码,因为每个小的处理延迟都会损害感知的性能。
在这种情况下,您只是在检查互联网连接是否可用并通知用户。您可以通过将普通的JS函数嵌入到发送给浏览器的每个页面的开头来实现此目的,而无需完全使用ASP来实现此功能。只需让JS异步尝试访问基于Internet的服务器即可。如果您获得200,则表示互联网正常运行;如果网络为400或类似水平,则表示互联网正常运行。
如果您绝对“必须”坚持使用ASP,则可以将该功能提升到单独的ASP文件中,并使用相同的JS异步技术对其进行调用,从而使ASP成为无会话会话,并且包含
<%@ ENABLESESSIONSTATE=False %>
位于文件顶部。对基于会话的ASP页面的请求在顺序队列中运行,因此,进行无会话将阻止该请求阻塞队列。
摘要-使服务器从ASP的“ every = page”流中检出,理想情况下,将其从ASP中全部取出并制成纯JS。
答案 1 :(得分:0)
经过大量的实验,我找到了自己喜欢的解决方案,并且经受了重大的压力测试:
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