首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >请求之间的持久化/缓存数据.通用方法

请求之间的持久化/缓存数据.通用方法
EN

Stack Overflow用户
提问于 2009-08-11 23:48:27
回答 1查看 3K关注 0票数 6

我正在开发一个Asp.net (MVC,但这并不重要)应用程序。我有一个定制的IHttpModule,它负责PostAuthenticateRequest更改用户主体&标识。

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

因此,我在考虑如何以及在哪里最好地保存用户的IUser数据?

  1. 我不想每次都从DB (基于身份验证票的UserID数据)获取它。
  2. 我不能将它存储在会话中,因为我必须在PostAuthenticateRequest中工作,在那里会话还没有准备好
  3. 我希望所有的功能都封装在我的自定义IHttpModule中。

我看到的选择:

  • 缓存
  • 饼干
  • (会话)-通过从PostAuthenticateRequest转移到PostAcquireRequestState事件并在那里更改主体/标识,但我想避免这种情况

似乎使事情复杂化的过程是:

  1. 用户登录后,用户数据将从DB中获取,并以某种方式持久化以供以后的请求使用。
  2. 用户注销时,必须自动从持久化介质中删除用户数据。
  3. 用户更改自己的配置文件时,用户数据必须被丢弃,并在从DB发出的下一次请求时重新读取。

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

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

问题

  1. 你有什么建议?
  2. 如何在请求之间持久化用户数据?
EN

Stack Overflow用户

回答已采纳

发布于 2009-08-12 03:23:09

考虑到您的需求,我认为最好的解决方案是从cookie中检索ID,并使用它索引到Http (HttpContext.Current.Cache)。

如果要维护用户访问缓存的方式,请将缓存包装在"UserCache“对象中。对象可以由HttpModule构造并存储为(等待.)在缓存本身内的singleton,或者更好的是,只是在需要从http缓存中提取时构建。这将取决于您需要在哪里访问它,以及HttpContext.Current.Cache是否可以直接使用。延迟实现如下所示。

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

代码语言:javascript
运行
复制
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 server更新来处理更新,或者将其作为服务的一部分手动更新以保存更改。

有关默认缓存的更多信息是可用的这里。有关缓存依赖关系的更多信息可访问这里

在HttpModule本身中,我认为您可以在EndRequest事件中执行一些魔术,以查看请求是否经过身份验证,然后根据cookie登录用户,但我不确定这是否有效,因为我从未尝试过。您可能希望查看一下MSDN上的这篇文章,追溯到1.1天前,看看它是否解决了一些您想要解决的问题。

至于SO体系结构以及它们是如何实现的,我可以想象它们在需要时加载它,因为它们总是将大部分数据库保存在内存中(http://highscalability.com/stack-overflow-architecture)。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1263580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档