C# ASP.NET MVC会话字典

C# ASP.NET MVC会话字典,c#,asp.net-mvc,global-asax,C#,Asp.net Mvc,Global Asax,因此,基本上我有一个ConcurrentDictionary。我想做的事情是在用户登录时将SessionId/UserData对添加到此字典,并在用户注销或会话超时时将其从字典中删除。这样做的最佳实践是什么。我试图使用global.asax事件来实现这一点,但我找不到任何合适的事件。既然您使用的是MVC,我假设您使用的是一些标准身份验证提供程序。所以,只需找到负责身份验证控制器的用户,并在字典中设置相应的cotroller操作,而不是在global.asax事件中 Global.asax用于整个

因此,基本上我有一个
ConcurrentDictionary
。我想做的事情是在用户登录时将SessionId/UserData对添加到此字典,并在用户注销或会话超时时将其从字典中删除。这样做的最佳实践是什么。我试图使用global.asax事件来实现这一点,但我找不到任何合适的事件。

既然您使用的是MVC,我假设您使用的是一些标准身份验证提供程序。所以,只需找到负责身份验证控制器的用户,并在字典中设置相应的cotroller操作,而不是在global.asax事件中


Global.asax
用于整个应用程序全局事件,如应用程序初始化。

我建议使用一些现有的身份验证提供程序。例如,或新的

但如果您真的想使用字典,可以创建一个包含此字典的BaseController,从该BaseController派生的每个控制器都可以访问它:

public class BaseController : Controller
{
    private ConcurrentDictionary<string, CustomUserData> _users;
    protected ConcurrentDictionary<string, CustomUserData> Users
    {
        get
        {
            if (_users == null)
            {
                _users = new ConcurrentDictionary<string, CustomUserData>();
            }
            return _users;
        }
    }
}

为什么不直接使用会话状态?你可以添加一个额外的检查来确保用户登录,

你可以使用内置的功能,但是你应该考虑你是否真的需要把复杂的对象存储在内存中而不是数据库中。我同意RGraham的观点。你也可以考虑简单地使用Cookies以短的寿命。只有会话数据存储在内存中(在w3wp.exe进程中)时,才会通知您会话结束。在这种情况下,该词典应位于何处?这取决于您的目标,会话不是在用户之间共享的,缓存是为所有用户共享的,如果要将其存储一段时间,则为db。有很多方法可以存储它。我需要保留会话和用户数据。在我的应用程序之外,有一些人通过一些API与我连接,我需要跟踪与用户关联的会话,以向他们提供一些信息。因此,您已经保留了会话状态,但要存储(在db或其他中),以便其他应用程序也能看到这些数据?不确定我是否理解?那些其他应用程序没有访问我拥有的相同数据库的权限。我的意思是他们联系我的唯一方式就是通过API。基本上通过WCF服务。我必须为每个会话提供一个令牌,并保持所有内容同步
public class HomeController : BaseController
{
    // ...
}