如何有效地管理对Membership.GetUser()的多次调用

时间:2010-12-20 18:17:45

标签: c# .net asp.net-mvc-2 asp.net-membership

我有多次调用Membership.GetUser()并且似乎无法找到内置任何内容来应对此问题(多次没有访问数据库)。

我首先研究静态变量,然后才意识到这是不合适的。我知道我可以使用会话,但我需要对userID进行哈希/加密以使其安全,这很好但我不想这样做而不检查是否有内置的方法在.net成员中执行此操作提供商

是否有内置的方法来记住像UserID这样的值并为当前用户安全地存储它?

2 个答案:

答案 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>