为什么IHttpContextAccessor.HttpContext不正确

时间:2018-06-29 11:53:47

标签: c# asp.net-core asp.net-core-2.0

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

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
     .AddJwtBearer(...);
 services.AddHttpContextAccessor();
 services.TryAddSingleton<IUserInfo,UserInfo>();

第一个代码:

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
        }
    }
}

第二个代码:

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
        }
    }
}

当我在Action中使用第一个代码时,就可以了。 HttpContext.Request.Headers["Authorization"]有我的令牌,IsAuthenticated是真实的。

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

我想知道为什么,谢谢。

如果您听不懂我的话,对此我感到抱歉,我的英语不好。。。

1 个答案:

答案 0 :(得分:5)

IUserInfo,UserInfo已注册为单例,因此只会被初始化一次。(请记住,这很重要)

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

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

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