Если я добавлю конструктор в расширение AuthorizeAttribute, будет ли вызываться конструктор при каждом запросе, к которому прикреплен атрибут? - PullRequest
0 голосов
/ 05 марта 2020

Я написал собственное расширение System.Web.Mvc AuthorizeAttribute.
Справочник Microsoft здесь: SystemWebMvcAuthorizeAttribute .

Это расширение переопределяет функцию AuthorizeCore из AuthorizeAttribute и предполагаемое использование заключается в том, что этот пользовательский атрибут сохранит существующую функциональность AuthorizeAttribute, но также выполнит дополнительную проверку сеанса пользователя, если для параметра config установлено значение true.

Мы обеспокоены о производительности, так как этот пользовательский атрибут будет присоединен к каждому запросу API, заменяя используемый в настоящее время атрибут Authorize. В настоящее время в функции AuthorizeCore мы читаем настройку config для каждого отдельного запроса и задаемся вопросом, есть ли лучший способ сделать что-либо.

Итак, если я создаю конструктор для своего Пользовательский атрибут, прочитайте config там, а затем сохраните его в переменной static. Кто-нибудь знает, будет ли этот конструктор вызываться при каждом отдельном запросе, к которому присоединен этот пользовательский атрибут, или только один раз, а затем при каждом вызове? значение AuthorizeCore (вызывается при выполнении запроса) может указывать на переменную static, в которой хранится значение, уже прочитанное из config?

public class AuthorizeSessionAttribute : AuthorizeAttribute
{
    bool _manageSession = false;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Since we are overriding the AuthorizeCore from AuthorizeAttribute, make sure to call the base method first to check that this request 'isAuthorized' before proceeding.
        bool isAuthorized = base.AuthorizeCore(httpContext);

        if (isAuthorized)
        { 
            // Any way to improve this?
            bool.TryParse(ConfigurationManager.AppSettings["ManageSession"], out _manageSession);

            if (_manageSession)
            {
                // custom logic goes here
            }
        }
        return isAuthorized;
    }
}


1 Ответ

1 голос
/ 05 марта 2020

Вам не нужен конструктор. Вам просто нужно добавить класс c bool класса? (Nullable bool) переменная. Тогда в вашем методе только чтение данных из конфигурации, если ваша переменная равна нулю. В следующем исполнении, поскольку он не равен NULL, он не читает конфигурацию.

publi c class AuthorizeSessionAttribute: AuthorizeAttribute {private stati c bool? _manageSession;

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // Since we are overriding the AuthorizeCore from AuthorizeAttribute, make sure to call the base method first to check that this request 'isAuthorized' before proceeding.
    bool isAuthorized = base.AuthorizeCore(httpContext);

    if (isAuthorized)
    { 
        if (!_manageSession.HasValue && bool.TryParse(ConfigurationManager.AppSettings["ManageSession"], out bool parsedSetting))
        {
            _manageSession = parsedSetting;
        }

        if (_manageSession)
        {
            // custom logic goes here
        }
    }
    return isAuthorized;
}

}

...