如何处理会话保持打开状态
本文关键字:状态 会话 何处理 处理 | 更新日期: 2023-09-27 18:33:02
我正在实现一个会话结构。
我在服务器端有一个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会自动过期。
如果你的会话状态是"InProc",为什么不只在Session_Start和Session_End中应用你的代码呢?
void Session_Start(object sender, EventArgs e)
{
//Add to ConcurrentDictionary
}
void Session_End(object sender, EventArgs e)
{
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
//Remove from ConcurrentDictionary
}
几个月
后我正在回答我自己的问题。如果我想拥有这样的结构,我会使用 Microsoft SignalR。因为它以实时方式为我控制会话并执行更多操作。