我正在创建一个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,怎么来的?
在asp.net核心中,如果我们创建一个web api控制器,它默认具有ControllerBase
。
如果你想在调用动作之前做某事,你可以使用Action Filter或Authorization Filter。参考Implementing Action Filters in ASP.NET Core。
调用Controller的构造函数时,HttpContext
不可用。看到这个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...
}