从webapi net core 2.2中的ControllerBase继承是一种好习惯

时间:2019-02-22 23:28:37

标签: .net .net-core asp.net-core-webapi core httpcontext

我正在创建一个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,为什么呢?

1 个答案:

答案 0 :(得分:1)

在asp.net核心中,如果我们创建一个Web api控制器,则默认情况下它具有ControllerBase

如果您想在调用操作之前先做某事,可以使用Action FilterAuthorization 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...
}

请参阅Access HttpContext in ASP.NET Core