如何获得会话结束的通知?

我想知道我是否可以处理会话超时事件。 我需要在会话超时或用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。 这里最重要的部分是访问会话期间存储的所有内容,会话变量。

看一下global.asax中的Session_End()方法。 应该已经连接global.asax文件以在会话结束时调用此方法。 您可以根据需要将代码放在那里。

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) ' Fires when the session ends End Sub 

当然,您应该注意到会话完全是服务器端的事情。 它只会在X分钟不活动后结束(默认为20分钟)。 它不会在用户关闭窗口的瞬间结束。 ASP.NET不知道用户关闭窗口或离开页面。

事实上,当发生这种情况时,尝试在服务器端执行任何立即操作是很棘手的。 我的意思是,在Javascript中调用window.onbeforeunload并在用户关闭窗口之前调出一个确认框很容易。 但是,当您尝试在窗口实际关闭之前立即将数据包发送到服务器时,我认为您会发现使这一切变得用户友好是一项艰巨的任务。 您可以编写一些Javascript,使用AJAX向服务器发送消息,通知服务器用户正在关闭浏览器,然后在发送消息后使用更多Javascript关闭浏览器。 但随后用户将收到恼人的消息(在大多数浏览器中),说明脚本正在尝试关闭窗口。 这对用户来说看起来非常业余,可能会让他们三思而后行。

因此,如果你愿意忍受延迟,我会完全避免整个Javascript混乱,并依赖于使用Session_End()的纯服务器端解决方案。 毕竟,如果用户关闭窗口或离开,ASP.NET 最终会注意到因为会话将超时。

Session_end将处理会话超时问题。 但是,当用户关闭浏览器或移动到其他URL时,这不会触发。 它等待直到会话超时到期。

为了检测其他条件,您必须在客户端上使用javascript。 但是,这些方法并不总是可靠的,具体取决于浏览器/版本等。此外,如果用户的计算机关闭,拔掉电源,或者它们完全消失,则此脚本不会触发。

您可以考虑其他替代方案。 你究竟想用这个function完成什么?

网络是无状态的,因此您不会知道用户是否已关闭浏览器窗口。 您可以使用global.asax文件中的“Session_End”事件进行会话超时。 如果要访问所有会话,可以通过“Session_Start”事件将它们存储在集合中,也可以存储在全局文件中。

编辑:如果你想使用javascript拦截页面的关闭事件,这里是如何(注意,这是不可靠的):

 window.onbeforeunload = closeIt; function closeIt(){ return "You have unsaved changes. Are you sure you want to leave this page?"; } 

您可以拥有一个由每个aspx页面inheritance的基页,并在您的基页初始化事件中只检查会话变量。 如果它什么都不是那么它意味着会话已经过期,您可以将用户重定向到登录页面。