Microsoft.AspNetCore.Mvc.ControllerBase.Request。** get **返回null

时间:2020-03-30 03:53:34

标签: c# asp.net-core

在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)
    { }
} 

我有一个中间件设置,用于设置标题的Items集合中的“值”项。该值已按预期设置。

但是,一旦我击中了基本控制器的构造函数,所有属性均为空(Request,HttpConext,ControllerContext等)。

上面的设置曾经在WebApi2上正常工作。

我在这里想念什么?

2 个答案:

答案 0 :(得分:2)

您可以使用IHttpContextAccessor来访问asp.net核心中的HttpContext

首先,您必须使用IHttpContextAccessor这样的方法注册ConfigureServices

services.AddHttpContextAccessor();

然后从DI访问HttpContext

 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 :(得分:1)

在ASP.Net Core 3+中执行此操作的方法是将IHttpContextAccessor注入控制器,然后将其注册为Singleton。

当我使用Autofac处理我的DI时,我通过添加以下内容来做到这一点:

        builder.RegisterType<HttpContextAccessor>()
             .As<IHttpContextAccessor>()
             .SingleInstance();