Microsoft.AspNetCore. Mvc .ControllerBase.Request. ** get ** возвращается null - PullRequest
0 голосов
/ 30 марта 2020

В ASP. Net Core 3.1 проекте у меня есть «базовый» контроллер, который я наследую от ControllerBase, и он выглядит так:

[Authorize]
public abstract class BaseController : ControllerBase
{
    protected readonly IMapper mapper;
    protected readonly ILogger logger;

    protected BaseController(
        IMapper mapper, 
        ILogger logger)
    {
        this.mapper = mapper;
        this.logger = logger;

        var ok = Request.HttpContext.Items.TryGetValue("value", out object value);
    }
} 

А потом мои контроллеры, которые наследовать от него, например:

[Route("api/[Controller]"]
public class MyController : BaseController
{
    public MyController(
        IMapper mapper, 
        ILogger<MyController> logger, 
        /*...some other services injected here...*/) : base(mapper, logger)
    { }
} 

У меня есть промежуточное программное обеспечение, которое устанавливает элемент «value» в коллекции Items заголовка. Значение устанавливается в соответствии с ожиданиями.

Однако, как только я нажму на конструктор базового контроллера, все свойства будут нулевыми (Request, HttpConext, ControllerContext и др. c).

Приведенная выше настройка прекрасно работала с WebApi2.

Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Вы можете использовать IHttpContextAccessor для доступа к HttpContext в asp. net ядре.

сначала вы должны зарегистрироваться IHttpContextAccessor в ConfigureServices методе, подобном этому

services.AddHttpContextAccessor();

затем доступ к HttpContext из DI

 protected BaseController(
        IMapper mapper, 
        ILogger logger,
        IHttpContextAccessor httpContextAccessor)
    {
        this.mapper = mapper;
        this.logger = logger;

        var ok = httpContextAccessor.HttpContext.Items.TryGetValue("value", out object value);
    }
1 голос
/ 30 марта 2020

Способ сделать это в ASP. Net Core 3+ - ввести IHttpContextAccessor в контроллер, а затем зарегистрировать его как Singleton.

Поскольку я использую Autofa c чтобы обработать мой DI, я сделал это, добавив:

        builder.RegisterType<HttpContextAccessor>()
             .As<IHttpContextAccessor>()
             .SingleInstance();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...