ASP.NET Session_End 中的会话变量

28

我需要在global.asax.cs文件的Session_End事件中访问Session变量,但HttpContext.Current为null,因此无法访问任何Session变量。

a) 我能以不同的方式访问用户会话,或者

b) 有没有其他在Session_End之前的事件,我可以访问用户的会话变量?

3个回答

49

HttpContext.CurrentSession_End 中不可用,但您可以直接访问会话实例,方法是使用 this.Session


2
是的。System.Web.SessionState.HttpSessionState 是我应该使用的,而不是 HttpContext.Current。谢谢 - the berserker
在看了这个链接 https://dev59.com/yWjWa4cB1Zd3GeqPnh9X 之后,我真的很有帮助,但我怀疑为什么它会返回 null。我检查了一下,发现我使用了 HttpContext.Current。 - MSTdev

0

除非您使用Session_End来执行会话超时时的操作,否则依赖Session_End并不是一个好主意。

我认为没有可靠的方法来捕获用户会话的结束(例如当他们关闭浏览器时)。


2
这并不一定是正确的。如果您正在使用InProc会话,当一个会话在[timeoutvalue]分钟内没有活动时,它将触发。如果您正在使用存储的会话,则不会发生这种情况。 - womp
1
我认为如果您需要一个准确的全局活动用户会话列表,那么依赖于session_end可能是唯一的方法。 - the berserker

0

你想做什么?

在 Session_End 之前没有事件可以用来访问 Session 对象。

如果你存储了与上次使用 Session 对象相关的操作时间戳,然后检查它,你就可以大致知道何时应该结束。
(基于你的 IIS 设置/配置)。 但是访问它的行为会延长 Session 对象的生命周期。

当然,你需要以某种方式进行检查,可以使用隐藏的 Ajax 回发触发事件或类似的方法。

但实际上我不建议这样做。你为什么需要这样做?


1
我正在尝试保持所有具有活动会话的用户的全局列表。因此,当用户的会话结束时(假设用户没有注销,而是只是关闭了浏览器),我需要清除用户的会话,因此我需要通过某些会话GUID从全局哈希表中删除该用户。据我所知,对于不同的请求,SessionID可能是不同的,因此我不能使用它。 - the berserker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接