在 Web API .NET Core 2.2 中继承 ControllerBase 是一种好习惯吗?
Is it good practice to inherit from ControllerBase in Web API .NET Core 2.2?
我正在创建一个 webapi,我想创建一个继承自 ControllerBase 的控制器 class。
我这样做是因为我需要在调用操作之前做一些事情,即检查用户注册并使用 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
}
这是一个好的做法还是我应该在一开始就通过中间件class完成所有这些工作?
另一个问题,当继承ControllerBase class 到我的自定义BaseApiZrController class 时,我无法访问httpContext,它总是returns null,怎么会?
在 asp.net 核心中,如果我们创建一个网络 api 控制器,它默认有 ControllerBase
。
如果你想在调用动作之前做一些事情,你可以使用Action Filter or Authorization Filter.Refer to Implementing Action Filters in ASP.NET Core。
HttpContext
在调用Controller的构造函数时不可用。
看到这个 .
您可以使用 IHttpContextAccessor
帮助程序服务获取任何 class 中由 ASP.NET 核心依赖注入系统管理的 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...
}
我正在创建一个 webapi,我想创建一个继承自 ControllerBase 的控制器 class。
我这样做是因为我需要在调用操作之前做一些事情,即检查用户注册并使用 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
}
这是一个好的做法还是我应该在一开始就通过中间件class完成所有这些工作?
另一个问题,当继承ControllerBase class 到我的自定义BaseApiZrController class 时,我无法访问httpContext,它总是returns null,怎么会?
在 asp.net 核心中,如果我们创建一个网络 api 控制器,它默认有 ControllerBase
。
如果你想在调用动作之前做一些事情,你可以使用Action Filter or Authorization Filter.Refer to Implementing Action Filters in ASP.NET Core。
HttpContext
在调用Controller的构造函数时不可用。
看到这个
您可以使用 IHttpContextAccessor
帮助程序服务获取任何 class 中由 ASP.NET 核心依赖注入系统管理的 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...
}