Как эффективно управлять несколькими вызовами в Membership.GetUser () - PullRequest
3 голосов
/ 20 декабря 2010

У меня есть несколько обращений к Membership.GetUser (), и я не могу найти ничего встроенного, чтобы справиться с этим (без попадания в базу данных несколько раз).

Сначала я посмотрел на статические переменные, прежде чем понял, что это не подходит.Я знаю, что могу использовать сеансы, но мне нужно было бы хэшировать / шифровать userID, чтобы сделать его безопасным, и это хорошо, но я не хотел делать это без проверки, был ли встроенный способ сделать это в членстве .netпровайдер

Существует ли встроенный способ запоминания значения, такого как идентификатор пользователя, и безопасного его хранения для текущего пользователя?

Ответы [ 2 ]

5 голосов
/ 21 декабря 2010

Я рекомендую использовать шаблон Singleton-per-Request , который использует свойство 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() возвращает ноль.

4 голосов
/ 20 декабря 2010

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>
...