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

本文关键字:状态 会话 何处理 处理 | 更新日期: 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。因为它以实时方式为我控制会话并执行更多操作。