为什么IHttpContextAccessor.HttpContext不正确

1 c# asp.net-core asp.net-core-2.0

这是一个asp.net核心项目.这是我的代码.

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
     .AddJwtBearer(...);
 services.AddHttpContextAccessor();
 services.TryAddSingleton<IUserInfo,UserInfo>();
Run Code Online (Sandbox Code Playgroud)

第一个代码:

public class UserInfo : IUserInfo
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserInfo(IHttpContextAccessor iHttpContextAccessor)
    {
        _httpContextAccessor = iHttpContextAccessor;
    }

    public UserData GetUserData()
    {
        if (_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
        {
           // do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个代码:

public class UserInfo : IUserInfo
{
    private readonly HttpContext _httpContext;

    public UserInfo(IHttpContextAccessor iHttpContextAccessor)
    {
        _httpContext= iHttpContextAccessor.HttpContext;
    }

    public UserData GetUserData()
    {
        if (_httpContext.User.Identity.IsAuthenticated)
        {
            // do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用第一个代码时Action,它很好.HttpContext.Request.Headers["Authorization"]有我的令牌,IsAuthenticated是真的.

但是当我使用第二个代码时,它无法工作.HttpContext是不正确的.HttpContext.Request.Headers["Authorization"]是空的,IsAuthenticated是假的.

我想知道这就是原因,谢谢.

如果你不明白我的话,我很抱歉,我的英语非常糟糕......

Nko*_*osi 5

IUserInfo,UserInfo 注册为单身,所以它只会被初始化一次.(记住,这很重要)

在第一个示例中,每次GetUserData()调用都会_httpContextAccessor.HttpContext返回当前请求HttpContext.

在第二个例子中,HttpContext只会在单例类的构造函数中设置一次.这意味着每次GetUserData()调用时,您将获得第一次初始化时设置的相同上下文.这意味着正在使用的上下文不会是当前请求的上下文,因为在初始化类时请求将不可用.

第一个示例是建议的访问当前的方法HttpContext.

  • 谢谢!我明白了,你真好。 (2认同)