Mic*_*cah 10 .net c# asp.net httpcontext thread-safety
我想要为每个请求缓存用户所处的角色.在任何给定页面中有几个地方我们有类似的地方:
<% if(Roles.IsUserInRole("RoleName")) {%>
    <!-- Conditional Rendering -->
<% } else if(Roles.IsUserInRole("AnotherRole") {%>
    <!-- You get the point -->
<% } %>
由于这都存储在sql数据库中,因此每个请求都会访问数据库.我知道有办法在cookie中缓存角色,但我不想这样做.无论如何,我在想的是这样的.
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()查找上下文中的项目,也许这不是最有效的事情.我真正想知道的是,这是否会基于每个请求缓存它,因此与其他用户请求没有重叠.
Sha*_*rde 11
这看起来很安全,快速浏览一下.HttpContext.Current.Items是一个每HTTP请求缓存.考虑进一步减少数据库调用的另一个选择是使用会话状态.
考虑一个场景,其中有一个页面包含大量的ajax内容.每个ajax请求都会调用数据库调用来加载安全角色,因为它们都是单独的HTTP请求.
| 归档时间: | 
 | 
| 查看次数: | 6394 次 | 
| 最近记录: |