如何处理会话保持开放状态

Tom*_*Tom 6 c# asp.net-mvc asp.net-session .net-4.5

我正在实现一个会话结构.

我有一个ConcurrentDictionary服务器端保持所有<SessionId, UserSession>对.

建立新连接时,会根据RememberMe选项将cookie分配给客户端浏览器,perm或temp .

当客户端调用该LogOut函数时,它会从字典中删除会话.

但是,当客户端浏览器被简单地关闭或崩溃,并且cookie丢失或过期或删除时,内存中的服务器端会话对象将保留在字典中并变为重影.随着时间的推移,这些鬼魂会堆积起来.

我的问题是,如何改进设计,以便在死亡会话过期后将其清理干净?

我想过让计时器服务运行一个清洁计划,但感觉不优雅.有没有更简单的方法来做到这一点,而不依赖于外部服务?

Ema*_*eiz 5

我在我的一个项目中遇到了类似的情况。

我没有使用字典,而是使用绝对过期时间短的缓存和用户的会话 ID 作为我的缓存键:

HttpContext.Current.Cache.Insert(sessionID, userEntity, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero);
Run Code Online (Sandbox Code Playgroud)

在客户端,我每 15 秒进行一次 ajax 调用,以通知服务器并更新该会话 ID 的缓存。

因此,每当用户关闭浏览器窗口时,服务器都不会收到任何通知,并且用户的会话 ID 会自动过期。