会话在关闭窗口时能否触发Session_End事件?(ASP.NET)

4
我将在网站上添加一个“在线”计数器,但是我遇到了这两个相互矛盾的来源。
其中一个(我正在使用此示例代码):

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并不会触发。

我基本上希望你们确认或评论一下这个问题。

是否可以在关闭浏览器时更新在线计数器?

3个回答

7

第二个是真的

关闭浏览器窗口或浏览到另一个网站不会立即导致Session_End触发,至少服务器无法知道客户端机器上发生了什么,直到它从中获得另一个HttpRequest。在这种情况下,Session_End将在会话自然超时时触发。

默认情况下,会话超时时间为20分钟。您可以通过在网站上不进行任何活动20分钟来确认此内容。


3
你的两个链接并不矛盾。第一个链接措辞不当,但基本上与第二个链接说的一样。如果它写成这样会更容易理解:
“此外,当用户关闭浏览器或在我们的网站上不点击任何链接(一段时间后),会话将过期,并且我们的‘OnlineUsers’全局变量会减少。”
还要注意,Session_End可能不总是会触发,特别是如果会话被终止或反弹(例如,如果您更新了web.config,工作进程会重新启动,或者在某些情况下发生未捕获的异常)。

2
在第一个链接中提到,Session_End事件会在会话超时后触发。如果与会话关联的用户在会话超时值到期之前没有向服务器发送任何请求,会触发session_end事件并将会话从内存中删除。
asp.net会话状态的MSDN文档:http://msdn.microsoft.com/en-us/library/ms178581.aspx

你说有办法处理浏览器关闭事件。我之前尝试过 onunloadonbeforeunload,但据我所知它们只在IE中有效... - Jesper
你需要设置类似于长轮询(查找SignalR或Comet)的东西,以确定浏览器何时断开连接。默认情况下,应该预期所有已呈现的页面都完全断开连接。我已经删除了你所提到的那句话,以避免混淆。 - Gary.S
@Jeeper,这些事件适用于所有浏览器;您可以在StackOverflow的问题或答案页面上确认这一点。但是我不建议您通过这些事件来终止用户会话。 - Waqas Raja
@WaqasRaja:是的,因为它在你停留在网站上时也会卸载,所以它并不完美。 ;) - Jesper
如果您正在参考页面生命周期的一部分,即 asp.net unload 事件:http://msdn.microsoft.com/en-us/library/system.web.ui.control.unload.aspx。当您创建自定义控件并希望运行一些清理代码时,它非常有用。如果您使用工作单元,也可以在 page_init 上初始化它,并在 page_unload 上处理它。 - Gary.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接