我自定义了一个LoginInfo类,使用单例模式注入
public class JwtLoginInfo : ILoginInfo
{
private readonly HttpContext _httpContext;
public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
{
_httpContext = httpContextAccessor.HttpContext;
}
public Guid AccountId
{
get
{
var accountId = _httpContext.User.FindFirst("id");
if (accountId != null && accountId.Value.NotNull())
{
return new Guid(accountId.Value);
}
return Guid.Empty;
}
}
}
使用上面的代码,会出现_httpContext.User.Clamis为empty的情况,导致accountId有时能获取到,有时候获取不到
不能使用单例模式注入,改用 Scoped
或者改为
public class JwtLoginInfo : ILoginInfo
{
private readonly IHttpContextAccessor _httpContextAccessor;
public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public Guid AccountId
{
get
{
var accountId = _httpContextAccessor.HttpContext.User.FindFirst("id");
if (accountId != null && accountId.Value.NotNull())
{
return new Guid(accountId.Value);
}
return Guid.Empty;
}
}
}
@dudu: 老大,这个是什么原因呢?是不是因为在get里面访问HttpContext的时候与构造函数里面的状态不一样了
@oldli: 问题不是构造函数中访问 HttpContext,而是你将 HttpContext 赋值给了 _httpContext ,单例模式下的成员变量 _httpContext 相当于是静态的,而 HttpContext 是针对请求的
@dudu: 明白了,谢谢老大~
貌似是httpcontext生命周期的问题,https://github.com/aspnet/AspNetCore/issues/3668 有木有大佬给解释一下
– oldli 5年前