【发布时间】:2018-11-07 13:42:02
【问题描述】:
我需要在 Session End 事件上做点什么。 如何访问此活动? 与此事件类似的任何事情都可能超时?
【问题讨论】:
标签: asp.net-core-2.1
我需要在 Session End 事件上做点什么。 如何访问此活动? 与此事件类似的任何事情都可能超时?
【问题讨论】:
标签: asp.net-core-2.1
ASP.NET 有一个Session_OnEnd 事件,您可以在 Global.asax 中注册,但即便如此,它也非常不可靠:您只能将它与进程内会话一起使用,并且它只能监视会话到期,而不是当用户执行诸如关闭浏览器窗口之类的操作。
不过,ASP.NET Core 没有类似的东西,主要是因为它真的没有意义。最重要的是,ASP.NET Core 是为扩展而设计的,进程内的 anything 是其对立面。会话存储是默认分发的。即使您确实使用内存中的会话,它仍然使用IDistributedCache 的实现。拥有分布式会话存储会导致无法监控过期,因此尚未添加此类功能。
更重要的是,会话不会主动过期。相反,当用户下一次发回会话 cookie 时,在允许会话过期后,会话被销毁并创建一个新会话。会话也采用滑动过期,因此只要用户在超时窗口内保持活动状态,会话就不会过期。
长短不一,你要找的东西是不可能的。但是,这确实会引起 XY 问题。您有某种需要解决的问题 (X),并且您已决定解决它的方法是在会话到期 (Y) 时做一些事情。但是,您也无法弄清楚如何做 Y,所以您问的是关于 Y 的问题,而实际上您应该问的是 X。我建议创建一个关于 实际 的新问题> 您需要解决的问题;可能有更好的方法。
【讨论】:
在ASP.NET Core 中处理此问题的唯一方法 - 在客户端的页面加载(在JS 代码中)安排会话超时计时器并在接近到期时警告用户。如果用户响应 - ping 服务器端(刷新会话),或将用户重定向到注销页面。您的会话超时可以在Startup 类中配置。因此,您需要将相同的值传递给客户端视图,设置一个计时器(假设是 20 分钟)以在 19 分钟后向用户显示模式,并带有倒计时一分钟的计时器和一个像“保持在线”这样的按钮。当用户单击按钮时 - 对服务器端执行 AJAX 调用(Home 控制器中的一些 Ping 操作,或类似的东西)。
【讨论】:
ASP.NET Core