在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上正常工作。
我在这里想念什么?
答案 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();