本文簡要介紹了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(方法->控制器->全局)