过滤器类型

net core 有五种过滤器,每个过滤器类型在过滤器管道中的不同阶段执行:

1:IAuthorizationFilterAttribute 授权过滤器
2:IResourceFilterAttribute 资源过滤器
3:ExceptionFilterAttribute 异常过滤器
4:ActionFilterAttribute方法过滤器
5:ResultFilterAttribute 结果过滤器

Filter 执行顺序

Net Filter之ActionFilterAttribute - 图1

ActionFilterAttribute

异步环绕操作的执行和操作结果的抽象筛选器。官方文档
方法过滤器:它会在执行Action方法前后被调用。这个可以在方法中用来处理传递参数和处理方法返回结果。

属性

Order 获取用于确定筛选器执行顺序的顺序值。
筛选器以属性的 Order 升序数值执行。

方法

OnActionExecuted(ActionExecutedContext)) 在操作执行后调用,然后再执行操作结果。
OnActionExecuting(ActionExecutingContext)) 在执行操作之前调用,在模型绑定完成后。
OnActionExecutionAsync(ActionExecutingContext, ActionExecutionDelegate)) 在操作完成之后、模型绑定完成后以异步方式调用。
OnResultExecuted(ResultExecutedContext)) 在操作结果执行之后调用。
OnResultExecuting(ResultExecutingContext)) 在操作结果执行之前调用。
OnResultExecutionAsync(ResultExecutingContext, ResultExecutionDelegate)) 在操作结果之前异步调用。

在过滤器中使用依赖注入

有时候我们可能需要读取程序运行环境的信息,根据不同的环境做出不同的响应内容

  1. public void OnResultExecouting(ResultExecutingContext context)
  2. {
  3. var env=(IHostingEnvironname)context.HttpContext.RequestService.GetService(typeof(IHostingEnvironment))
  4. }

示例

先定义一个WeatherForecastActionFilterAttribute的Action Filter,

  1. using Microsoft.AspNetCore.Mvc.Controllers;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. using System.Text.Json;
  5. namespace Net6.Filter.Demo.Filters;
  6. /// <summary>
  7. /// WeatherForecast的 Action Filter
  8. /// </summary>
  9. public class CustomerActionFilterAttribute:ActionFilterAttribute
  10. {
  11. /// <summary>
  12. /// Action方法调用之前执行
  13. /// </summary>
  14. /// <param name="context"></param>
  15. public override void OnActionExecuting(ActionExecutingContext context)
  16. {
  17. var descriptor = context.ActionDescriptor as ControllerActionDescriptor;
  18. string param = string.Empty;
  19. string globalParam = string.Empty;
  20. foreach (var arg in context.ActionArguments)
  21. {
  22. string value = JsonSerializer.Serialize(arg.Value);
  23. param += $"{arg.Key} : {value} \r\n";
  24. globalParam += value;
  25. }
  26. Console.WriteLine("OnActionExecuting,Action 方法调用之前执行");
  27. //Console.WriteLine($"webapi方法名称:【{descriptor.ActionName}】接收到参数为:{param}");
  28. }
  29. /// <summary>
  30. /// Action 方法调用后,Result 方法调用前执行
  31. /// </summary>
  32. /// <param name="context"></param>
  33. public override void OnActionExecuted(ActionExecutedContext context) {
  34. Console.WriteLine("OnActionExecuted,Action 方法调用后,Result 方法调用前执行");
  35. }
  36. /// <summary>
  37. /// Result 方法调用前执行
  38. /// </summary>
  39. /// <param name="context"></param>
  40. public override void OnResultExecuting(ResultExecutingContext context) {
  41. Console.WriteLine("OnResultExecuting,Result 方法调用前执行");
  42. }
  43. /// <summary>
  44. /// Result 方法调用后执行
  45. /// </summary>
  46. /// <param name="context"></param>
  47. public override void OnResultExecuted(ResultExecutedContext context)
  48. {
  49. var descriptor = context.ActionDescriptor as ControllerActionDescriptor;
  50. string result = string.Empty;
  51. if (context.Result is ObjectResult)
  52. {
  53. result = JsonSerializer.Serialize(((ObjectResult)context.Result).Value);
  54. }
  55. Console.WriteLine("OnResultExecuted,Result 方法调用后执行");
  56. //Console.WriteLine($"webapi方法名称【{descriptor.ActionName}】执行的返回值 : {result}");
  57. }
  58. }

再到需要使用WeatherForecastActionFilterAttribute的方法头部添加上属性标记

  1. using Microsoft.AspNetCore.Mvc;
  2. using Net6.Filter.Demo.Filters;
  3. using Net6.Filter.Demo.Models;
  4. namespace Net6.Filter.Demo.Controllers.FilterDemo;
  5. public class FilterDemoController : AreaController
  6. {
  7. private static readonly string[] Summaries = new[]
  8. {
  9. "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
  10. };
  11. private readonly ILogger<FilterDemoController> _logger;
  12. public FilterDemoController(ILogger<FilterDemoController> logger)
  13. {
  14. _logger = logger;
  15. }
  16. [HttpGet(Name = "GetWeatherForecast")]
  17. [CustomerActionFilterAttribute]
  18. public IEnumerable<WeatherForecast> Get()
  19. {
  20. return Enumerable.Range(1, 5).Select(index => new WeatherForecast
  21. {
  22. Date = DateTime.Now.AddDays(index),
  23. TemperatureC = Random.Shared.Next(-20, 55),
  24. Summary = Summaries[Random.Shared.Next(Summaries.Length)]
  25. })
  26. .ToArray();
  27. }
  28. }

1664080192017.png

ActionExecutedContext

操作筛选器的上下文,特别是 OnActionExecuted(ActionExecutedContext)) 调用。

属性

ActionDescriptor 获取或设置 ActionDescriptor 所选操作。
Canceled 获取或设置操作筛选器对操作和操作筛选器管道进行短路的指示。
Controller 获取包含操作的控制器实例。
Exception 获取或设置 Exception 在执行操作或操作筛选器时捕获的捕获(如果有)。
ExceptionDispatchInfo 获取或设置捕获的 Exception 、如果捕获了此信息,则获取或设置ExceptionDispatchInfoException该信息。
ExceptionHandled 获取或设置已处理的指示 Exception
Filters 获取所有适用的 IFilterMetadata 实现。
HttpContext 获取或设置 HttpContext 当前请求。
ModelState 获取 ModelStateDictionary
Result 获取或设置 IActionResult
RouteData 获取或设置 RouteData 当前请求。

方法

FindEffectivePolicy() 返回应用于与FilterContext该操作关联的操作类型TMetadata的最有效 (最具体的) 策略。
IsEffectivePolicy(TMetadata)) 返回一个值,该值指示所提供的 IFilterMetadata 策略是否是应用于与 FilterContext该操作关联的操作的最有效策略 (最具体的) 。

ActionExecutingContext

操作筛选器的上下文

属性

ActionArguments 获取调用操作时要传递的参数。 键是参数名称。
ActionDescriptor 获取或设置 ActionDescriptor 所选操作。
Controller 获取包含操作的控制器实例。
Filters 获取所有适用的 IFilterMetadata 实现。
HttpContext 获取或设置 HttpContext 当前请求。
ModelState 获取 ModelStateDictionary
Result 获取或设置 IActionResult 要执行的。 设置为 Result 操作筛选器中的非null 值会使操作和剩余的任何操作筛选器短路。
RouteData 获取或设置 RouteData 当前请求。

方法

FindEffectivePolicy() 返回应用于与FilterContext该操作关联的操作类型TMetadata的最有效 (最具体的) 策略。
IsEffectivePolicy(TMetadata)) 返回一个值,该值指示所提供的 IFilterMetadata 策略是否是应用于与 FilterContext该操作关联的操作的最有效策略 (最具体的) 。

ResultExecutedContext

Properties

ActionDescriptor 获取或设置所选操作的 ActionDescriptor。
Canceled 获取或设置操作筛选器对操作和操作筛选器管道进行短路的指示。
Controller 获取或设置操作筛选器对操作和操作筛选器管道进行短路的指示。
Exception 获取或设置 Exception 在执行操作或操作筛选器时捕获的捕获(如果有)。
ExceptionDispatchInfo 获取或设置捕获的 Exception 、如果捕获了此信息,则获取或设置ExceptionDispatchInfoException该信息。
ExceptionHandled 获取或设置已处理的指示 Exception
Filters 获取所有适用的 IFilterMetadata 实现。
HttpContext 获取或设置 HttpContext 当前请求。
ModelState 获取 ModelStateDictionary
Result 获取或设置 IActionResult 要执行的。 设置为 Result 操作筛选器中的非null 值会使操作和剩余的任何操作筛选器短路。
RouteData 获取或设置 RouteData 当前请求。

Methods

FindEffectivePolicy() 返回应用于与FilterContext该操作关联的操作类型TMetadata的最有效 (最具体的) 策略。
IsEffectivePolicy(TMetadata)) 返回一个值,该值指示所提供的 IFilterMetadata 策略是否是应用于与 FilterContext该操作关联的操作的最有效策略 (最具体的) 。

ResultExecutingContext

Properties

ActionDescriptor 获取或设置所选操作的 ActionDescriptor。
Cancel 获取或设置操作筛选器对操作和操作筛选器管道进行短路的指示。
Controller 获取或设置操作筛选器对操作和操作筛选器管道进行短路的指示。
Filters 获取所有适用的 IFilterMetadata 实现。
HttpContext 获取或设置 HttpContext 当前请求。
ModelState 获取 ModelStateDictionary
Result 获取或设置 IActionResult 要执行的。 设置为 Result 操作筛选器中的非null 值会使操作和剩余的任何操作筛选器短路。
RouteData 获取或设置 RouteData 当前请求。

Methods

FindEffectivePolicy() 返回应用于与FilterContext该操作关联的操作类型TMetadata的最有效 (最具体的) 策略。
IsEffectivePolicy(TMetadata)) 返回一个值,该值指示所提供的 IFilterMetadata 策略是否是应用于与 FilterContext该操作关联的操作的最有效策略 (最具体的) 。