【问题标题】:Is it good practice to inherit from ControllerBase in Web API .NET Core 2.2?从 Web API .NET Core 2.2 中的 ControllerBase 继承是一种好习惯吗?
【发布时间】:2019-02-22 23:28:36
【问题描述】:

我正在创建一个 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

 }

这是一个好习惯还是我应该通过中间件在开始类中做所有这些?

另外一个问题,我自定义的BaseApiZrController类继承ControllerBase类时,无法访问httpContext,总是返回null,怎么回事?

【问题讨论】:

  • 对于身份验证和授权,请务必查看 ASP.NET Core Security and Identity 文档中的这些部分。这可以通过配置(在 Startup.cs 中)、操作属性和对授权服务的调用(用于基于资源的授权)轻松处理,而无需使用中间件或类似的东西。

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


【解决方案1】:

在 asp.net core 中,如果我们创建一个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2014-04-03
    • 2011-02-08
    • 2014-08-27
    • 2013-02-13
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多