我正在实现一个会话结构.
我在服务器端有一个ConcurrentDictionary,持有所有< SessionId,UserSession>对.
建立新连接时,会根据RememberMe选项将cookie分配给客户端浏览器,perm或temp.
当客户端调用logout函数时,它会从字典中删除会话.
但是,当客户端浏览器被简单地关闭或崩溃,并且cookie丢失或过期或删除时,内存中的服务器端会话对象将保留在字典中并变为重影.随着时间的推移,这些鬼魂会堆积起来.
我的问题是,如何改进设计,以便在死亡会话过期后将其清理干净?
我想过让计时器服务运行一个清洁计划,但感觉不优雅.有没有更简单的方法来做到这一点,而不依赖于外部服务?
我的一个项目有类似的情况.
而不是字典,我使用短暂的绝对过期缓存和用户的会话ID作为我的缓存键:
HttpContext.Current.Cache.Insert(sessionID,userEntity,null,DateTime.Now.AddSeconds(30),TimeSpan.Zero);
在客户端,我每隔15秒进行一次ajax调用,通知服务器并更新该会话ID的缓存.
因此,每当用户关闭其浏览器窗口时,服务器都不会收到任何通知和用户的会话ID自动过期.