User.FindFirstValue(ClaimTypes.NameIdentifier)是否查询数据库?会产生额外请求吗?
问题1解答
User.FindFirstValue(ClaimTypes.NameIdentifier) 不会查询数据库。
ASP.NET Core 身份验证中间件会在请求到达业务代码前,就把加密存储在Cookie(默认Cookie认证场景)或请求头JWT中的用户声明信息解密解析完毕,全部存入User对象的Claims集合中,这一步是纯内存操作,没有任何数据库IO开销。
问题2解答
你给出的第二段代码只会产生1次数据库请求:
- 读取用户ID的操作是从内存的
User对象中取值,无IO - 只有后续EF Core的
FirstOrDefaultAsync调用会触发一次带Include关联查询的数据库请求,不存在两次往返的问题,这个写法是完全合规的优化方案。
Guid uId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)); ApplicationUser user = await db.Users .Include(c => c.City) .Where(u => u.Id == uId).FirstOrDefaultAsync();
问题3解答
你的判断是正确的,第三段代码确实会产生2次数据库请求:
_userManager.GetUserAsync(User)内部默认会根据用户声明的ID去数据库查询一次完整的ApplicationUser对象- 后续你自己写的EF查询又会按ID再查询一次带关联属性的用户对象,两次查询完全重复,会产生不必要的性能损耗。
// 以下代码会触发两次数据库查询,不推荐 var usr = await _userManager.GetUserAsync(User); ApplicationUser user = await db.Users .Include(c => c.City) .Where(u => u.Id == usr.Id).FirstOrDefaultAsync();
内容的提问来源于stack exchange,提问作者Stian
相关产品推荐
相关产品推荐

