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