【发布时间】:2021-01-01 19:11:21
【问题描述】:
我在让自定义操作过滤器在 ASP.NET Core 3.1 Web API 中工作时遇到了一些困难。我关注了this SO,以及Microsoft docs,但它不起作用。我创建了一个简单的过滤器(注意:我需要依赖注入);
public class LogFilterAttribute : ActionFilterAttribute, IFilterMetadata
{
private readonly ILogger<LogFilterAttribute> _logger;
public LogFilterAttribute(ILogger<LogFilterAttribute> logger)
{
_logger = logger;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
_logger.LogWarning("test");
base.OnActionExecuting(actionContext);
}
}
注意事项:
-
ActionFilterAttribute来自System.Web.Http.Filters命名空间。 -
我实现了
IFilterMetadata(这只是一个标记接口),因为ServiceFilter和TypeFilter似乎需要这样做。
我在Startup.cs 的ConfigureServices 中注册,如下所示:
services.AddScoped<LogFilterAttribute>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
然后将其应用到我的 Web API 控制器中,如下所示:
[ApiVersion("1.0")]
[ApiController]
[Route("v{version:apiVersion}/resources/{id}")]
public class ResourceController : ControllerBase
{
private readonly ILogger<ResourceController> _logger;
public ResourceController(ILogger<ResourceController> logger)
{
_logger = logger;
}
[HttpGet]
[ServiceFilter(typeof(LogFilterAttribute))]
public async Task<IActionResult> Get([FromRoute(Name = "id")] string id)
{
_logger.LogInformation($"{typeof(ResourceController)}.{nameof(Get)}");
return Ok();
}
}
我已经尝试过ServiceFilter 和TypeFilter,但无济于事 - 它只是跳过过滤器中的断点并直接进入我的路由逻辑。我做错了什么?
【问题讨论】:
标签: asp.net-web-api action-filter