2009-08-11 117 views
1

我有一个方法,我需要在Session_end上运行。有什么方法可以确保用户关闭浏览器时运行代码?这可能是一个重要的问题。我看到一个响应正在调用ajax卸载或某个东西,但是我不希望在用户关闭浏览器时每次用户离开页面时都会触发它。Session_End代码在浏览器关闭

感谢, 〜CK

+2

ASP.NET会话状态与用户何时或如果关闭浏览器无关。 – 2009-08-11 21:01:10

+3

另请注意,Session_End只会触发In-Proc模式 – TWith2Sugars 2009-08-11 21:22:47

回答

2

答案很简单:你无法控制用户的浏览器。您提到的AJAX解决方案是您可以实现的最接近(无需插件/自定义客户端)。想象一下,每次打开和关闭浏览器窗口时都可以跟踪某个网站。你不觉得这会是一个隐私问题吗?

真相在于HTTP的无状态本质。 Web服务器在完成将响应发送到客户端后就不在图片中。在那之后,所有你可以信赖的是客户端脚本(它只执行,因为客户端需要它;并且它可以容易地选择不运行脚本)。

2

Session_end是不可靠的。无论你做什么。

Session_end仅在使用进程会话时触发。如果您正在使用会话状态服务器或SQL会话,则session_end不会触发。

在进程会话中使用时,只有在会话中存储了某些内容时才会触发session_end。如果你不使用会话,session_end永远不会触发。

如果您正在使用会话并且用户关闭浏览器,那么当用户会话超时时,会触发session_end。虽然它将具有与原始会话相同的设置,但该事件不会绑定到浏览器,因为它是检测会话超时并触发session_end进程的工作进程。

+0

如果是这样,它不在浏览器和服务器之间。一旦会话结束,我们可以依靠Session_end在不久的将来在某个地方开火。所以,如果我有一个静态的计数器,我可以统计有多少会话仍然处于活动状态。 – Bergkamp 2015-06-10 10:38:11

+0

该计数器通常会偏高。它将包括关闭浏览器但会话尚未超时的用户的会话。 – 2015-06-10 12:29:43

+0

如果您可以请解释“偏高”。另外,我目前在我的网站上构建一个聊天应用程序,并希望有一个静态的用户列表,以便我可以检索所有名称和ID。所以,稍后知道用户已经注销并不是那么糟糕。没有? – Bergkamp 2015-06-11 09:44:48