Я хочу кэшировать роли, в которых находится пользователь, для каждого входящего запроса. На каждой странице есть несколько мест, где у нас есть что-то вроде:
<% 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()
будет искать предмет в контексте, и, возможно, это не самая эффективная вещь. Что я действительно хочу знать, так это то, будет ли это кэшироваться для каждого отдельного запроса, чтобы не было совпадений с запросом других пользователей.