一、簡介
在.net core 中Filter分為以下六大類:
1、AuthorizeAttribute(權限驗證)
2、IResourceFilter(資源緩存)
3、IActionFilter(執行方法前后的記錄)
4、IResultFilter(結果生成前后擴展)
5、IAlwaysRun(響應結果的補充)
6、IExceptionFilter(異常處理)
二、IActionFilter(同步)
1、定義Filter
public class CustomerActionFilterAttribute : Attribute, IActionFilter { /// <summary> /// 在XXAction執行之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuting"); } /// <summary> /// 在XXAction執行之后 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuted"); } }
2、使用Filter
public class Home1Controller : Controller { private readonly ILogger<HomeController> _logger; public Home1Controller(ILogger<HomeController> logger) { _logger = logger; Console.WriteLine($"執行 {this.GetType().Name} 構造函數"); } [CustomerActionFilter] public IActionResult Index() { Console.WriteLine($"執行 Index 方法"); return View(); } }
3、擴展記錄日志
public class CustomerActionFilterAttribute : Attribute, IActionFilter { private readonly ILogger<CustomerActionFilterAttribute> _logger; public CustomerActionFilterAttribute(ILogger<CustomerActionFilterAttribute> logger) { _logger = logger; } /// <summary> /// 在XXAction執行之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { var para = context.HttpContext.Request.QueryString.Value; var controllerName = context.ActionDescriptor.RouteValues["controller"]; var actionName = context.ActionDescriptor.RouteValues["action"]; _logger.LogInformation($"當前請求的控制器是{controllerName},方法名{actionName},請求參數是{JsonConvert.SerializeObject(para)}"); } /// <summary> /// 在XXAction執行之后 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { var para = context.Result; var controllerName = context.ActionDescriptor.RouteValues["controller"]; var actionName = context.ActionDescriptor.RouteValues["action"]; _logger.LogInformation($"當前請求的控制器是{controllerName},方法名{actionName},請求結果是{JsonConvert.SerializeObject(para)}"); } }
public class Home1Controller : Controller { private readonly ILogger<HomeController> _logger; public Home1Controller(ILogger<HomeController> logger) { _logger = logger; Console.WriteLine($"執行 {this.GetType().Name} 構造函數"); } [TypeFilter(typeof(CustomerActionFilterAttribute))] public IActionResult Index(int id) { Console.WriteLine($"執行 Index 方法"); ViewBag.Data = new { name = "11111" }; return View(); } }
三、IAsyncActionFilter(異步)
public class CustomerAsyncActionFilterAttribute : Attribute, IAsyncActionFilter { private readonly ILogger<CustomerAsyncActionFilterAttribute> _logger; public CustomerAsyncActionFilterAttribute(ILogger<CustomerAsyncActionFilterAttribute> logger) { _logger = logger; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var para = context.HttpContext.Request.QueryString.Value; var controllerName = context.ActionDescriptor.RouteValues["controller"]; var actionName = context.ActionDescriptor.RouteValues["action"]; _logger.LogInformation($"當前請求的控制器是{controllerName},方法名{actionName},請求參數是{JsonConvert.SerializeObject(para)}"); var excuteContext = await next.Invoke(); // 這句話就是去執行Action _logger.LogInformation($"當前請求的控制器是{controllerName},方法名{actionName},請求結果是{JsonConvert.SerializeObject(excuteContext.Result)}"); } }
public class Home1Controller : Controller { private readonly ILogger<HomeController> _logger; public Home1Controller(ILogger<HomeController> logger) { _logger = logger; Console.WriteLine($"執行 {this.GetType().Name} 構造函數"); } //[TypeFilter(typeof(CustomerActionFilterAttribute))] [TypeFilter(typeof(CustomerAsyncActionFilterAttribute))] public IActionResult Index(int id) { Console.WriteLine($"執行 Index 方法"); ViewBag.Data = new { name = "11111" }; return View(); } }
四、總結
作用:該Filter可以記錄Action執行前后的參數和結果
執行順序: 1、執行控制器的構造函數 2、執行CustomerActionFilterAttribute.OnActionExecuting 3、執行Action方法 4、執行CustomerActionFilterAttribute.OnActionExecuted