我正在创建一个webapi,我想创建一个从ControllerBase类继承的控制器。
之所以这样做,是因为在调用该动作之前,我需要做一些事情,即检查用户注册并使用HttpContext。
public class BaseApiZrController : ControllerBase
{
public BaseApiZrController(ApplicationDbContext db)
{
this.HandleAuthentication();
//??? this.HttpContext is always null, how come?
ClaimsPrincipal claimsPrincipal = this.HttpContext.User;
}
//...some code
}
这是一个好习惯吗,还是我应该通过中间件在开始课程中完成所有这些工作?
另一个问题,当将ControllerBase类继承到我的自定义BaseApiZrController类中时,我无法访问httpContext,它始终返回null,为什么呢?
答案 0 :(得分:1)
在asp.net核心中,如果我们创建一个Web api控制器,则默认情况下它具有ControllerBase
。
如果您想在调用操作之前先做某事,可以使用Action Filter或Authorization Filter。请参考Implementing Action Filters in ASP.NET Core。
HttpContext
在调用Controller的构造函数时不可用。
参见此post。
您可以使用IHttpContextAccessor
帮助程序服务来获取由ASP.NET Core依赖项注入系统管理的任何类中的HTTP上下文。当您拥有控制器使用的通用服务时,这很有用。
private readonly IHttpContextAccessor _httpContextAccessor;
public BaseApiZrController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
ClaimsPrincipal claimsPrincipal = _httpContextAccessor.HttpContext.User;
}
在startup.cs中:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Other code...
}