我多次调用Membership.GetUser(),但似乎找不到任何内置的方法来处理这个问题(不多次访问数据库)。
我首先研究了静态变量,然后才意识到这是不合适的。我知道我可以使用会话,但我需要对userID进行散列/加密以使其安全,这很好,但我不想在没有检查.net成员资格提供程序内是否有内置方法的情况下这样做
有没有一种内置的方式来记住像UserID这样的值,并为当前用户安全地存储它?
发布于 2010-12-21 02:30:27
Membership.GetUser()是对类MembershipProvider的方法的间接调用:
public abstract MembershipUser GetUser(string username, bool userIsOnline);因此,您可以编写一个派生自正在使用的MembershipProvider (例如,SqlMembershipProvider或ActiveDirectoryMembershipProvider,或自定义的)的类,并使用某种巧妙的缓存机制覆盖此方法。
然后,您需要更改web.config以声明这个新的MembershipProvider类:
<membership defaultProvider="MyProvider">
<providers>
<clear/>
<add name="MyProvider" type="...MyProvider" ... />
</providers>
</membership>发布于 2010-12-21 22:30:56
我推荐使用使用HttpContext.Items属性的Singleton-per-Request pattern。
public class UserPerRequest
{
/// <summary>
/// Returns the result of Membership.GetUser(), but will cache the results within the
/// current request so it's only called once per request.
/// </summary>
public static MembershipUser Current
{
get
{
const string key = "UserPerRequest";
if (HttpContext.Current.Items[key] == null)
HttpContext.Current.Items[key] = Membership.GetUser();
return (MembershipUser)HttpContext.Current.Items[key];
}
}
}所以只要调用Membership.GetUser(),就调用UserPerRequest.Current就行了。只有当Membership.GetUser()返回null时,您才会在请求期间收到对数据库的多个调用。
https://stackoverflow.com/questions/4492561
复制相似问题