2009-08-11 70 views
5

我正在开发一个Asp.net(MVC,但这并不重要)应用程序。我有一个自定义的IHttpModule负责PostAuthenticateRequest以更改用户主体的身份。请求之间持久化/缓存数据 - 常用方法

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

所以我在想如何以及在哪里最好坚持登录用户的IUser数据?

  1. 我不想每次从数据库中获取它(基于身份验证票证的用户ID数据)
  2. 我不能把它存储在会话,因为我不得不在屋里PostAuthenticateRequest,其中会话ISN”工作准备好面对尚未
  3. 我希望所有的功能,我自定义的内封装的IHttpModule

的选择,我看到:

  • 缓存
  • 饼干
  • (会话) - 由PostAuthenticateRequest移动到PostAcquireRequestState事件和变更主/身份出现,但我想避免这种

过程似乎使事情变得复杂是:

  1. 用户登录项,用户数据是从DB中取出并以某种方式持续购买请求
  2. 用户登录手续,用户数据已经被从持久介质自动魔法除去LY
  3. 用户更改自己的配置文件,用户数据将被废弃,并从DB

我wan't这一切要由HTTP模块自动处理(如果可能的话)消除开发人员的错误重读的下一个请求忘记重置这些东西。

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

问题

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

回答

4

根据您的要求,我想最好的解决方案是从cookie中检索ID并使用它来索引Http缓存(HttpContext.Current.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 Server更新,以便处理更新或手动更新它作为服务的一部分以保存更改。

有关默认缓存的更多信息可用here。有关cache dependencies的更多信息,请致电here

在HttpModule本身中,我想你可以在EndRequest事件中做一些魔术来查看请求是否已经过验证,然后根据cookie登录用户,但我不确定这是否会像我一样工作我从来没有尝试过。您可能需要在1.1天内在WAY上查看MSDN上的this article,看看它是否回答了您尝试解决的一些问题。

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