我有多次调用Membership.GetUser()并且似乎无法找到内置任何内容来应对此问题(多次没有访问数据库)。
我首先研究静态变量,然后才意识到这是不合适的。我知道我可以使用会话,但我需要对userID进行哈希/加密以使其安全,这很好但我不想这样做而不检查是否有内置的方法在.net成员中执行此操作提供商
是否有内置的方法来记住像UserID这样的值并为当前用户安全地存储它?
答案 0 :(得分:5)
我建议使用Singleton-per-Request pattern使用HttpContext.Items属性。
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。
答案 1 :(得分:4)
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>