本文简要介绍了ASP.Net Core Web API中的IActionFilter,对其调用顺序、特性标记、注册方法进行总结。具体环境为:VS2019 + ASP.Net Core 3.1。
1、IActionFilter调用顺序
在调用控制器(Controller)构造函数之后调用Filter;
在接口调用之前调用IActionFilter的OnActionExecuting方法,
在接口调用之后调用IActionFilter的OnActionExecuted方法。
2、特性标记
(1)直接使用特性标记
使用这种方式要求IActionFilter子类具有无参构造函数。
[HttpGet] [Route("Info")] [CustomActionFilterAttribute] public string Info() { return "test info"; }
(2)使用TypeFilter特性
在这种方式中,IActionFilter子类的构造函数可以注入一些服务,并且不需要在Startup中注入Filter服务。
[HttpGet] [Route("Info")] [TypeFilter(typeof(CustomLogActionFilterAttribute))] public string Info() { return "test info"; }
(3)使用ServiceFilter特性
在这种方式中,IActionFilter子类的构造函数可以注入一些服务,但是需要在Startup中注入Filter服务。
[HttpGet] [Route("Info")] [ServiceFilter (typeof(CustomLogActionFilterAttribute))] public string Info() { return "test info"; } //注册ActionFilter服务 services.AddSingleton<CustomLogActionFilterAttribute>();
3、注册方法(使用方法)
(1)方法注册
[HttpGet] [Route("Info")] [ServiceFilter (typeof(CustomLogActionFilterAttribute))] public string Info() { return "test info"; }
(2)控制器注册
[Route("api/[controller]")] [ApiController] [ServiceFilter(typeof(CustomLogActionFilterAttribute))] public class FilterController : ControllerBase { }
(3)全局注册
//注册Filter服务 services.AddSingleton<CustomLogActionFilterAttribute>(); //全局注册Filter services.AddMvc(options => { options.Filters.Add(typeof(CustomLogActionFilterAttribute)); });
(4)注意事项
如果同时使用方法注册、控制器注册、全局注册,那么对应的调用顺序为:
全局Filter OnActionExecuting-> 控制器Filter OnActionExecuting-> 方法Filter OnActionExecuting-> 执行API方法-> 方法Filter OnActionExecuted-> 控制器Filter OnActionExecuted-> 全局Filter OnActionExecuted
即
OnActionExecuting(全局->控制器->方法) -> 执行API方法 -> OnActionExecuted(方法->控制器->全局)