gpt4 book ai didi

asp.net-mvc - 在请求之间持久化/缓存数据 - 常用方法

转载 作者:行者123 更新时间:2023-12-04 15:28:19 25 4
gpt4 key购买 nike

我正在开发一个 Asp.net(MVC,但这并不重要)应用程序。我有一个自定义 IHttpModule 负责 PostAuthenticateRequest 更改用户主体和身份。

当用户登录时,我将 UserID 和 UserName 存储在身份验证 cookie 中。我有一个 IUser(由 DAO 和 Business Objects 层实现,每个层都有自己的附加成员),我在所有业务服务类中都需要它。当用户想要任何东西时,我必须提供 IUser 对象实例(通常来自业务对象层),因此提供身份验证票证中的 ID 是不够的。

所以我在考虑如何以及在哪里最好地保留登录用户的 IUser 数据?

  • 我不想每次都从数据库中获取它(基于身份验证票的用户 ID 数据)
  • 我无法将它存储在 Session 中,因为我必须在 PostAuthenticateRequest 中工作,其中 Session 尚未准备好
  • 我希望所有功能都封装在我的自定义 IHttpModule 中

  • 我看到的选择:
  • 缓存
  • cookies
  • (Session) - 通过从 PostAuthenticateRequest 移动到 PostAcquireRequestState 事件并在那里更改主体/身份,但我想避免这种情况

  • 似乎使事情复杂化的过程是:
  • 用户登录,用户数据从数据库中获取并以某种方式持久化以供以后的请求
  • 用户注销,用户数据必须自动从持久介质中删除
  • 用户更改了自己的配置文件,用户数据必须被丢弃并在来自 DB
  • 的下一个请求时重新读取

    我不想让 HttpModule 自动处理所有这些(如果可能)以消除开发人员忘记重置这些东西的错误。

    我也不想要的是写入/读取一些硬编码的变量/键并在应用程序的其他部分操作它们。这只会带来技术债务。

    问题
  • 你有什么建议?
  • SO 如何在请求之间保留用户数据?
  • 最佳答案

    鉴于您的要求,我认为最好的解决方案是从 cookie 中检索 ID 并使用它来索引到 Http 缓存 (HttpContext.Current.Cache)。

    如果要维护用户访问它的方式,请将 Cache 包装在“UserCache”对象中。该对象可以由 HttpModule 构造并作为(等待它...)单例存储在缓存本身中,或者更好的是,仅在需要从 http 缓存中提取时才构造。这取决于您需要访问它的位置以及 HttpContext.Current.Cache 是否直接可用。懒惰的实现如下。

    同样,这是为了清楚起见,而不是我实际实现它的方式。

    public class UserCache
    {
    public IUser GetUser(object userKey)
    {
    return HttpContext.Current.Cache[userKey];
    }

    public void AddUser(object userKey, IUser user)
    {
    /* this could pull the key from the user object as well. */
    HttpContext.Current.Cache.Add(/* add the object with key and a sliding expiration that is slightly greater than session timeout */);
    }

    public void ExpireUser(object userKey)
    {
    HttpContext.Current.Cache.Remove(userKey);
    }

    /* If you don't want to do SQL cache dependency */
    public void UpdateUser(object userKey, IUser user)
    {
    HttpContext.Current.Cache.Insert(/* ... */);
    }
    }

    使用默认缓存机制(或者更好的是由 DI 提供的缓存机制,这样您就不会受到实现的束缚),您可以设置到期时间以自动从缓存中删除用户,如评论中所述。您可以将缓存设置为依赖于 SQL 服务器更新以及处理更新或手动更新它作为服务的一部分以保存更改。

    有关默认缓存的更多信息可用 here .更多信息 cache dependencies有货 here .

    在 HttpModule 本身中,我想您可以在 EndRequest 事件中使用一些魔法来查看请求是否经过身份验证,然后根据 cookie 将用户注销,但我不确定这是否可行,因为我从未尝试过它。您可能想看看 this article在 1.1 天内从 WAY 回到 MSDN 上,看看它是否回答了您试图解决的一些问题。

    至于 SO 架构以及他们如何做到这一点,我想他们会在需要时加载它,因为他们始终将大部分数据库保留在 RAM 中( http://highscalability.com/stack-overflow-architecture )。

    关于asp.net-mvc - 在请求之间持久化/缓存数据 - 常用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263580/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com