почему IHttpContextAccessor.HttpContext не является правильным - PullRequest
0 голосов
/ 29 июня 2018

Это основной проект 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 голосов
/ 29 июня 2018

IUserInfo,UserInfo зарегистрирован как одиночный, поэтому он будет инициализирован только один раз (помните, что это важно)

В первом примере каждый раз, когда вызывается GetUserData(), _httpContextAccessor.HttpContext возвращает текущий запрос HttpContext.

Во втором примере HttpContext будет установлен только один раз в конструкторе синглтон-класса. Это означает, что каждый раз, когда вызывается GetUserData(), вы получите тот же самый контекст, который был установлен при первой инициализации. Это означало бы, что используемый контекст не был бы контекстом текущего запроса, поскольку запрос еще не был бы доступен при инициализации класса.

Первый пример - предлагаемый способ доступа к текущему HttpContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...