【问题标题】:ASP.NET MVC Session DictionaryASP.NET MVC 会话字典
【发布时间】:2013-10-24 07:12:39
【问题描述】:

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

【问题讨论】:

  • 可以使用内置的Session State 功能,但您应该考虑是否真的需要将复杂对象存储在内存中而不是数据库中。跨度>
  • 我同意 RGraham。您也可以考虑简单地使用寿命较短的 cookie。只有当会话数据存储在内存中(在 w3wp.exe 进程中)时,才会通知您会话结束。

标签: c# asp.net-mvc global-asax


【解决方案1】:

好吧,既然您使用的是 MVC,我假设您使用一些标准的身份验证提供程序。因此,只需找到您负责身份验证控制器,并在适当的控制器操作中为您设置字典,而不是在 global.asax 事件中。

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

【讨论】:

  • 那么这本词典应该放在哪里?
  • 这取决于你的目标,会话不在用户之间共享,缓存是为所有用户共享的,如果你想将它存储一段时间,则为 db。您可以通过多种方式存储它。
【解决方案2】:

为什么不只使用会话状态?您可以添加一个额外的检查以确保用户已登录?

【讨论】:

  • 出于某种原因,我需要保留会话和用户数据。我的应用程序之外的一些人通过一些 API 连接到我,我需要跟踪与用户关联的会话以向他们提供一些信息。
  • 所以你已经保持会话状态,但存储(在数据库或其他)以供另一个应用程序也看到这些数据?不确定我是否理解?
  • 那些其他应用程序无权访问我拥有的相同数据库。我的意思是他们与我联系的唯一方式是通过那个 API。基本上是通过 WCF 服务。我必须为每个会话提供一个令牌并保持一切同步
【解决方案3】:

我建议使用一些已经存在的身份验证提供程序。例如FormsAuthentication,或者新的ASP.NET Identity

但是如果你真的想使用字典,你可以创建一个包含这个字典的 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;
        }
    }
}

现在您可以从此控制器派生:

public class HomeController : BaseController
{
    // ...
}

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 2014-10-14
    • 2012-05-24
    • 2015-01-14
    • 2015-03-13
    • 2011-08-12
    • 2023-03-05
    相关资源
    最近更新 更多