在http请求中过于频繁地查询经过身份验证的用户对象

时间:2016-08-26 22:25:31

标签: asp.net-core asp.net-core-mvc

我正在使用带有asp.net身份的asp.net核心mvc。

我的ApplicationUser有一个属性:Country => 'GB'或'FR'等...

我想将System.Threading.Thread.CurrentThread.CurrentCulture设置为从applicationUser.Country读取的值。在我的视图中正确显示所有日期时间/数字值,由用户设置。

因此我创建了这个动作过滤器:

 public class LanguageActionFilter : ActionFilterAttribute
    {
        private readonly ILogger _logger;
        private UserManager<ApplicationUser> _userManager;
        public LanguageActionFilter(ILoggerFactory loggerFactory, UserManager<ApplicationUser> userManager)
        {
            _logger = loggerFactory.CreateLogger("LanguageActionFilter");
            _userManager = userManager;
        }

        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var user = await _userManager.GetUserAsync(context.HttpContext.User);
            Thread.CurrentThread.CurrentCulture = new CultureInfo(user.Country);

            await base.OnActionExecutionAsync(context, next);
        }
    }

在设置此actionfilter的操作/控制器上,我还运行以下代码:

public async Task<IActionResult> Index()
{
    var user = await this.userManager.GetUserAsync(User);      
    var todos = await service.GetTodosAsync(user.Id);
    return View(todos);
}

目前我致电this.userManager.GetUserAsync(User);

两次!

然后我考虑将用户对象传递给

context.HttpContext.Items.Add("applicationUser", user);

并在Index() action方法中再次抓取此用户对象:

 var user = (ApplicationUser)base.HttpContext.Items["applicationUser"];

这有用,但这是个好主意吗?你觉得这种方法有什么问题吗?

2 个答案:

答案 0 :(得分:1)

你做的很好......

我引用了HttpContext类的定义:

{{1}}

答案 1 :(得分:0)

编辑:似乎ef核心不支持第一级缓存。所以我的想法一无所获

您的代码有效,但我认为您不会获得相当大的性能。

您可能在实体框架中使用aspnet标识。由于ef支持first level cache。 ,如果你多次调用this.userManager.GetUserAsync(User);,ef只从数据库中检索一次用户实体。因此,两种方式对性能的影响大致相同。我不会在你的情况下使用HttpContext.Items