Asp.net mvc 在请求之间持久化/缓存数据-常用方法
我正在开发一个Asp.net(MVC,但这并不重要)应用程序。我有一个自定义IHTTP模块,负责PostAuthenticateRequest以更改用户主体和标识 当用户登录时,我将用户ID和用户名存储在身份验证cookie中。我有一个IUser(由DAO和业务对象层实现,每个层都有自己的附加成员),我在所有业务服务类中都需要它。当用户需要任何东西时,我必须提供IUser对象实例(通常来自业务对象层),因此从身份验证票证提供ID是不够的 所以我在想,如何以及在哪里保存登录用户的IUser数据是最好的Asp.net mvc 在请求之间持久化/缓存数据-常用方法,asp.net-mvc,forms-authentication,persistence,user-data,Asp.net Mvc,Forms Authentication,Persistence,User Data,我正在开发一个Asp.net(MVC,但这并不重要)应用程序。我有一个自定义IHTTP模块,负责PostAuthenticateRequest以更改用户主体和标识 当用户登录时,我将用户ID和用户名存储在身份验证cookie中。我有一个IUser(由DAO和业务对象层实现,每个层都有自己的附加成员),我在所有业务服务类中都需要它。当用户需要任何东西时,我必须提供IUser对象实例(通常来自业务对象层),因此从身份验证票证提供ID是不够的 所以我在想,如何以及在哪里保存登录用户的IUser数据是最
- 缓存
- 饼干
- (会话)-从PostAuthenticateRequest移动到PostAcquireRequestState事件并在那里更改主体/标识,但我希望避免这种情况
考虑到您的需求,我认为最好的解决方案是从cookie中检索ID并使用它索引到Http缓存(HttpContext.Current.Cache) 如果要维护用户访问缓存的方式,请将缓存包装在“UserCache”对象中。该对象可以由HttpModule构造,并作为(wait it…)单例存储在缓存本身中,或者更好的是,在需要从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更新来处理更新,也可以将其作为服务的一部分手动更新以保存更改
有关默认缓存的更多信息可用。有关的详细信息,请参阅
在HttpModule本身中,我想您可以在EndRequest事件中使用一些魔法来查看请求是否经过身份验证,然后根据cookie将用户注销,但我不确定这是否有效,因为我从未尝试过。您可能希望在1.1天内查看MSDN,看看它是否回答了您试图解决的一些问题
至于SO体系结构以及它们是如何实现的,我可以想象它们会在需要时加载它,因为它们始终将大部分数据库保存在RAM中()