我正在实施会话结构。如何处理打开的会话
我有一个ConcurrentDictionary
在服务器端持有所有<SessionId, UserSession>
对。
建立新连接时,根据RememberMe
选项将cookie分配给客户端浏览器,perm或temp。
当客户端调用LogOut
函数时,它会从字典中删除会话。
但是,当客户端浏览器简单地关闭或崩溃,并且cookie丢失或过期或被删除时,内存中的服务器端会话对象仍保留在字典中并成为重影。随着时间的推移,这些鬼魂会堆积起来。
我的问题是,如何改进设计,以便在死亡会话过期后可以清理?
我想过让定时器服务运行一个清洁计划,但感觉不够优雅。有没有更简单的方法来做到这一点,而不依赖于外部服务?
最好是使用带滚动条件的缓存或处理Session_End方法。你在UserSession中存储什么? – zimdanen
没有可靠的Session_End方法来处理,如果客户端浏览器崩溃,那么它就在那里结束,而不会回话到服务器。但现在你提到了一个缓存,我有一个想法,我可以存储一个按LastActive时间排序的列表。每当新客户端登录时,他可以帮助检查队列中最早的会话,并在过期时删除。当他呼叫服务器执行某些操作时,每个活动用户都会将自己置于队列的后面。所以,他成为最新的活跃人物。 – Tom
您是否在某些时候需要查看有关已登录的每个人的数据?如果没有,为什么不将数据存储在会话中(如果您需要数据)并在会话超时后让它消失?如果存在压力,那么也可以通过将项目从Session中删除来处理内存压力。或者使用带滚动超时的HttpContext.Cache,以便在上次访问后的一段时间后消失。 (基本上,不需要推出自己的产品。) – zimdanen