如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]

Posted

技术标签:

【中文标题】如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]【英文标题】:How to capture timestamp of window disconnect in ASP classic [duplicate] 【发布时间】:2021-08-03 22:34:05 【问题描述】:

我需要捕获用户在 ASP 经典 (.asp) 中的页面上花费的总时间。这与需要分析页面以获取页面逻辑执行时间的时间无关。我只对捕获每个用户在网站上,特别是在某个页面上花费的时间感兴趣。如果客户端出现意外断开连接,也需要捕获经过的时间。

我知道在 ASP.net 中有 3rd 方实用程序和工具可以做到这一点 - 但我正在努力寻找可以在 ASP 经典中工作的东西。我读到了一个关于可能使用循环在显示页面时使用最新时间不断更新数据库的建议 - 但这似乎有点读/写密集?

有什么建议吗?

【问题讨论】:

过去曾经大量使用Softwing.Profiler component 进行页面计时,甚至构建了一个自定义类,使用它来对会话中的操作进行计时。一个非常有用的 COM 组件。 使用示例here. 【参考方案1】:

您始终可以使用Timer 命令并比较时间以获得“差异”。您遇到的问题是 ASP 经典是服务器端单向的,这意味着它与客户端没有双向连接。仅在加载或刷新页面时与服务器交换数据。您可以包含一些 javascript 选项,这些选项允许在不需要重新加载页面的情况下进行某些事务。使用数据库跟踪时间的方法会很有用,因为每次重新加载页面时,Timer 都会被重置。

<% 'Variables
   dim StartTime, StopStop, HowLong
   'set the StartTime
   StartTime = Timer 
       'your function goes here
   'set the StopTime
   StopTime = Timer 'stops the timer
   'set HowLong to be equal to StopTime subtract Start Time
   HowLong = StopTime - StartTime
   'Display the results to screen
   Response.Write ("It took " & HowLong & " seconds to complete.")
%>

现在该脚本只是为了向您展示如何跟踪过去了多长时间。我想我解释了 ASP Classic 仅作为服务器端的问题的局限性,因此您需要使用一种方法,就像您在考虑不断输出 HowLong 变量并将其与数据库进行比较的位置一样。

最后要考虑的一件事是,离开页面或刷新页面会重新触发脚本,因此您需要采取一些故障保护措施以避免不必要的回发或其他并发症,因为我们不知道是什么你的脚本可以。如果您给我更多信息,我或许可以提供更多建议,但在没有看到您的代码在做什么的情况下,我希望这足以让您指出正确的方向。

编辑 - 另一个想法是您可以使用 Session 对象在页面加载之间存储数据。您可以使用它来将计时器与数据库中的计时器进行比较。 Session 对象也是安全的,不能由用户手动修改,因此它是在页面加载之间传递数据的安全方式。这是一些关于如何存储到 Session 变量中并从中提取的示例代码。假设我们同时使用这两个脚本,这样我就可以将 HowLong 传递并存储到 Session 变量中。尽管您需要数据库,因为它不是长期存储,但它会在几分钟内超时,如果您希望它们在空闲时也能持续很长时间,您可以指定它们应该持续多长时间。现在进入代码。

<%  
'store into a session variable
HowLong = Session("HowLong")
'read from a session variable
Session("HowLong") = HowLong
%>

希望编辑添加了您可能需要的额外内容。我想我基本上只是解释了如何做他们所说的过程。如果您包含 Session 方法,您可以使用它来存储数据,因此您只需每隔几分钟左右从数据库中写入或读取。

OHH 编辑 - 我忘了提到 Timer 以秒为单位计算,或者自 80 年代的日期以来经过了多少秒。因此,尽管您可以比较日期和时间戳来获取时间,但如果您想查看某事开始和停止的时间,Timer 是最简单的方法,无需担心数据类型或类似的事情。最后一件事是关于 Session 变量,如果你关闭浏览器,它们就会变得很糟糕。我认为这不适用于标签,但很想知道。但是,如果您使用此计时器、数据库、会话方法,它可以跟踪它何时开始,但在没有不断检查数据库的情况下让它检测精确的断开连接时间将是一个问题。就像,你最好在 javascript 或 Asp.net 中使用一些东西以不复杂的方式来做,但我知道这并不总是可能的,但根据提供的信息,我试图提供一些希望有的指导有帮助,但您发现问题在于它无法在没有用户输入的情况下将任何内容更新到服务器,唯一的输入是用户关闭窗口,这不是 ASP 直接检测到的,而是使用 Session 变量和不断的数据库检查,您可以将一些可能起作用的东西散列在一起。

【讨论】:

使用Timer的问题在于精度,这就是为什么像Softwing.Profiler这样的COM组件更适合并且可以处理更精确的时序。 是的,这就是我的回答的问题,我们不知道他们到底想做什么,我们只知道他们遇到的问题。这可能是 Timer 可以解决这个问题,但好点 user692942! 感谢您的精彩建议和详细信息。我将研究计时器功能。这可能会奏效。基本上,用户正在观看课堂视频,并且观看视频所花费的总时间需要计入学时。所以..如果由于某种原因,他们失去了互联网连接或因其他原因被启动,计时器将需要在那个时候停止。非常感谢您的帮助! @Lana 我不确定Timer() 会有多大用处,因为您可以捕获的最小值是几秒,而大多数动作将是毫秒,而 VBScript 本身不支持,这就是为什么我建议首先是 COM 组件。 再澄清一件事...我不想为逻辑执行的任何部分计时。只有用户在某个页面上花费的时间。再次感谢您的帮助!

以上是关于如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在播放框架中发送大文件时如何捕获客户端断开连接?

如何使用 Amphp 捕获 php websocket 断开的 TCP 连接异常?

具有用户属性(时间戳)的 LWT:不正常断开连接

TCP保证可靠性建立连接和断开连接的过程

TCP详解——连接建立与断开

TCP和服务器断开连接后重连怎么处理