我需要在会话结束事件上做些事情。 我怎样才能参加这个活动? 与此事件类似的内容可能会超时吗?
答案 0 :(得分:3)
ASP.NET具有一个Session_OnEnd
事件,您可以在Global.asax中进行注册,但是即使如此,它还是非常不可靠的:您只能将其与进程内会话一起使用,并且它只能监视会话的到期时间,而不能监视会话的到期时间。当用户执行诸如关闭浏览器窗口之类的操作时。
ASP.NET Core没有什么类似之处,主要是因为它实际上没有任何意义。最重要的是,ASP.NET Core是为规模而设计的,而在过程中 anything 恰恰相反。会话存储默认情况下是分布式的。即使您确实使用了内存会话,它仍在使用IDistributedCache
的实现。具有分布式会话存储使监视到期变得站不住脚,因此尚未添加此类功能。
更重要的是,会话未主动过期。而是在允许会话过期之后,用户下次发送回会话cookie时,该会话被销毁并创建了新会话。会话也会采用滑动式到期,因此只要用户在超时窗口内保持活动状态,会话就永远不会过期。
总之,您无法找到想要的东西。但是,这确实会引起XY问题。您遇到了一些需要解决的问题(X),并且已经决定解决问题的方法是对会话过期(Y)进行一些处理。但是,您也无法弄清楚如何做Y,所以您是在真正应该问X的时候问有关Y的问题。我建议创建一个关于 actual 您需要解决的问题;可能会有更好的方法。
答案 1 :(得分:2)
在ASP.NET Core
中处理此问题的唯一方法-在客户端加载页面(在JS
代码中),以安排会话超时计时器并在用户即将到期时向用户发出警告。如果用户响应-ping服务器端(以刷新会话),或者没有将euser重定向到注销页面。您可以在Startup
类中配置会话超时。因此,您需要将相同的值传递给客户端视图,设置一个计时器(假设是20分钟),以便在19分钟后向用户显示模式,同时倒计时1分钟,并显示一个按钮,例如“保持在线”。当用户单击按钮时-进行AJAX
到服务器端的调用(您的Ping
控制器中的某个Home
操作或类似的操作)。