我在发展中的一个Asp.net (视,但这并不真正的问题)的应用程序。我有一个自定义IHttpModule负责PostAuthenticateRequest改变用户本金和身份。

我储存用户名和用户名的认证cookie当用户登录。我有一个IUser(实施的过道和业务对象层,每一个都有自己的其他成员),我需要所有业务服务类别。当一个用户希望任何东西我必须提供IUser目的实例(通常从商业对象层)所提供的ID认证的机票是不够的。

所以我想如何和在那里将是最好坚持登录用户的IUser数据?

  1. 我不想把它拿来每次从数据库(根据认证机票的UserID数据)
  2. 我不能储存会议,因为我要工作内PostAuthenticateRequest,在那里会议是不是准备好了没有
  3. 我希望所有的功能以封装在我的自IHttpModule

选择我看到:

  • 高速缓存
  • 饼干
  • (会议)通过的运动从PostAuthenticateRequest到PostAcquireRequestState事件和变化的主体/身份有,但是我想避免这个

进程似乎要复杂的事情是:

  1. 用户登录用户的数据取自数据库,并保留以某种方式对于以后的请求
  2. 用户登录出,用户的数据已被删除,从保留中自动的
  3. 用户更改自己的配置文件,用户的数据已被丢弃和重读在下一请求从数据库

我想所有这些是自动地处理由HttpModule(如果可能的话),以消除开发人员的错误遗忘的重置这些东西。

什么我也不想被写入/读一些硬编变量/键和操纵他们的其他部分中的应用程序。这只会本技术的债务。

的问题

  1. 你有什么建议吗?
  2. 怎么这么坚持用户之间的数据要求?
有帮助吗?

解决方案

鉴于你要求,我想最好的解决办法是检索ID从饼干并用它来索引入Http高速缓冲存储器(HttpContext.电流。缓冲存储)。

如果你想保持用户进行访问,包缓存在一个"UserCache"的对象。对象可以构成通过一个HttpModule和储存作为(等待它...)单内的高速缓存本身或者,更重要的是,只是建造在需要时从拉http缓存。这将取决于你需要访问它是否HttpContext.电流。高速缓存直接提供。懒惰的执行情况如下。

再次,这是为了清晰起见并不是我想实际上实施。

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(/* ... */);
  }
}

默认使用缓存机制(或者更好的是一个缓存机制提供的二所以你不依赖于一个实施),可以设定一个过期自动删除用户的高速缓存中提到的评论。你可以设置高速缓存依赖于SQL服务器更新,以及以处理更新或手工更新它作为服务的一部分,节省的变化。

更多的信息,关于默认的缓是可以 在这里,.更多的信息 缓存依赖 可是 在这里,.

在HttpModule本身,我想你可以做一些魔法在EndRequest事件来看,如果该请求是通过身份验证和登录用户的基础上的饼干,但是我不确定如果将作为我从来没有尝试过。你可能想看一看 这篇文章 在MSDN从早在1.1天,看看如果它回答一些问题,你们试图要解决。

作为对这样的建筑和它们如何做到这一点,我想像他们载在需要的时候,因为他们保留的大多数数据库在内存在的所有时间(http://highscalability.com/stack-overflow-architecture).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top