Доступ к HTTPContext - PullRequest
       12

Доступ к HTTPContext

0 голосов
/ 08 июля 2019

Я построил REST API в Net Core 2.1

Проект разделен на сборки:

  • APIREST (включает контроллеры)
  • МОДУЛИ (модули, содержащие логику и репозитории)

Можно ли правильно использовать HTTPContext в модулях для загрузки сохраненных UserId в JWT?

Запрос к базе данных требует информации о UserId в токене запроса

Я знаю, что когда я вызову область действия кода контроллера, я получу правильное значение, но получу ли я его также в другой сборке другого класса?

Когда объем запроса заканчивается, удаляется ли содержимое HTTPContext?

1 Ответ

2 голосов
/ 08 июля 2019

HttpContext имеет ограниченный срок службы и теперь вводится зависимость. В местах, где у вас нет доступа к нему из коробки (контроллеры / страницы / представления), вы можете внедрить IHttpContextAccessor, который является единственным, который знает, как извлечь экземпляр HttpContext в области видимости.

public class MyClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void MyMethod()
    {
        var userId = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);
        if (userId != null)
        {
            // do something
        }
    }
}

HttpContext потенциально может быть нулевым, поэтому вам нужно обработать это с нулевой проверкой.

Вам, конечно, нужно будет зарегистрировать MyClass в коллекции сервисов, и вам нужно будет также внедрить ее, когда вам это нужно, или ничего из этого не будет работать. Кроме того, IHttpContextAccessor не включен по умолчанию, так как это оказывает существенное влияние на производительность. Вам нужно будет добавить следующую строку в ConfigureServices вашего приложения, если вы хотите его использовать:

services.AddHttpContextAccessor();

Теперь, все сказанное, в значительной степени забудь все, что я только что сказал тебе. На самом деле не делай этого. Хорошо спроектированный класс должен следовать принципам SOLID, одним из которых является то, что он должен делать только одну вещь и делать это хорошо. В большинстве случаев совершенно неуместно, чтобы класс в какой-то библиотеке знал что-то вроде HttpContext.

Вместо этого, если вам нужен идентификатор пользователя в каком-либо методе, просто передайте его этому методу :

public void DoSomethingWithUserId(string userId)

Затем, например, в вашем контроллере, где у вас уже есть доступ к HttpContext:

myClass.DoSomethingWithUserId(User.FindFirstValue(ClaimTypes.NameIdenfiier));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...