在ASP.NET Core 2.1中在服务器端捕获会话超时

时间:2018-11-07 13:42:02

标签: asp.net-core-2.1

我需要在会话结束事件上做些事情。 我怎样才能参加这个活动? 与此事件类似的内容可能会超时吗?

2 个答案:

答案 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操作或类似的操作)。