Статические данные по запросу в ASP.NET - PullRequest
10 голосов
/ 09 февраля 2011

Я хочу кэшировать роли, в которых находится пользователь, для каждого входящего запроса. На каждой странице есть несколько мест, где у нас есть что-то вроде:

<% if(Roles.IsUserInRole("RoleName")) {%>
    <!-- Conditional Rendering -->
<% } else if(Roles.IsUserInRole("AnotherRole") {%>
    <!-- You get the point -->
<% } %>

Поскольку все это хранится в базе данных sql, каждый из этих запросов попадает в базу данных. Я знаю, что есть способы кеширования ролей в куки, но я не хочу этого делать. Во всяком случае, то, что я думал, было что-то вроде этого.

public static class SecurityUtils
    {
        public static string[] UserRoles()
        {
            var context = HttpContext.Current;

            if (context == null) return Enumerable.Empty<string>();

            string[] roles;

            roles = context.Items["UserRoles"] as string[];

            if (roles == null)
            {
                roles = Roles.GetRolesForUser();
                context.Items["UserRoles"] = roles;
            }

            return roles;
        }
    }

Кто-нибудь видел какие-либо проблемы с этим? Я знаю, что когда-либо вызов UserRoles() будет искать предмет в контексте, и, возможно, это не самая эффективная вещь. Что я действительно хочу знать, так это то, будет ли это кэшироваться для каждого отдельного запроса, чтобы не было совпадений с запросом других пользователей.

Ответы [ 2 ]

11 голосов
/ 09 февраля 2011

Это выглядит достаточно безопасно с первого взгляда. HttpContext.Current.Items - это кеш запросов по HTTP. Другим вариантом, который следует рассмотреть для дальнейшего сокращения вызовов базы данных, будет использование состояния сеанса.

Рассмотрим сценарий, в котором у вас есть страница с множеством материалов, посвященных Ajax. Каждый ajax-запрос будет вызывать вызов базы данных для загрузки ролей безопасности, поскольку все они являются отдельными HTTP-запросами.

3 голосов
/ 09 февраля 2011

Он будет кэшировать его по запросу, поскольку вы используете текущий HttpContext.

Если вы используете статический элемент, он будет кэшироваться до тех пор, пока веб-приложение не будет переработано.

Как таковой, он выглядит нормально - фактически довольно распространенный шаблон (с использованием статического члена в качестве кэша в памяти или текущего HttpContext).

...