我在网站上放置一个“在线”柜台,我遇到了这两个相互矛盾的来源。
这个(我使用的是这个示例代码):
http://aspdotnetfaq.com/Faq/How-to-show-number-of-online-users-visitors-for-ASP-NET-website.aspx
...说:
当用户关闭浏览器或没有点击任何链接时 我们的网站,会话到期,以及我们的“OnlineUsers”全局变量 减少了。
然而,这一个:
http://www.velocityreviews.com/forums/t383710-session-end-guarantee.html
...说:
关闭浏览器窗口或浏览到其他网站不会导致 Session_End要点火,至少不是直接的 - 服务器有 绝对无法知道客户端机器上发生了什么,直到 它从它获得另一个HttpRequest。在这个例子中,Session_End 当会话自然超时时会触发。
我已经测试过,似乎Session_End没有开火。
我基本上希望你们对此进行确认或评论。
是否可以在浏览器关闭时更新在线计数器?
答案 0 :(得分:7)
第二个是真的
关闭浏览器窗口或浏览到其他网站不会导致 Session_End要点火,至少不是直接的 - 服务器有 绝对无法知道客户端机器上发生了什么,直到 它从它获得另一个HttpRequest。在这个例子中,Session_End 当会话自然超时时会触发。
默认情况下,会话超时为20分钟。您可以通过不在网站上进行任何活动20分钟来确认这一点。
答案 1 :(得分:3)
你的两个链接并不矛盾。第一个链接措辞不好,但基本上说的是第二个链接所说的内容。如果它是这样编写的话会更容易理解:
此外,当用户关闭浏览器或未点击我们网站上的任何链接时(一段时间后),会话将过期,我们的“OnlineUsers”全局变量将减少。
另请注意,Session_End可能并不总是触发,特别是如果会话被终止或被退回(例如,如果更新web.config,工作进程回收,或者在某些情况下发生未捕获的异常)。
答案 2 :(得分:2)
正如稍后在发布的第一个链接中指出的,Session_End事件在会话超时到期后触发。如果与会话关联的用户在会话超时值到期之前未向服务器发送任何请求,则会触发session_end事件,并且会话将从内存中删除。
用于asp.net会话状态的MSDN:http://msdn.microsoft.com/en-us/library/ms178581.aspx