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

Mak*_*Vi. 4 c# asp.net session timeout

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

Ste*_*ham 7

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

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the session ends
    End Sub
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 但是,您应该知道并非所有会话状态提供程序都支持Session_End事件.InProc会话状态应该没问题,但对于其他人,您需要在依赖此事件之前检查提供者文档. (3认同)