过滤器类型

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

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

Filter 执行顺序

Net Filter之IResourceFilter - 图1

IResourceFilter

资源过滤器: 它在Authorzation后面运行,同时在后面的其它过滤器完成后还会执行。Resource filters 实现缓存或其它性能原因返回。因为它运行在模型绑定前,所以这里的操作都会影响模型绑定。官方文档

资源过滤器实现自接口IResourceFilter或者 IAsyncResourceFilter

属性

方法

Methods

OnResourceExecuted(ResourceExecutedContext)) 执行资源过滤器。在执行管道的其余部分后调用。
OnResourceExecuting(ResourceExecutingContext)) 执行资源筛选器。 在执行管道的其余部分之前调用。

示例

先定义一个CustomerResourceFilter的ResourceFilter,

  1. using Microsoft.AspNetCore.Mvc.Filters;
  2. namespace Net6.Filter.Demo.Filters;
  3. public class CustomerResourceFilter : Attribute,IResourceFilter
  4. {
  5. /// <summary>
  6. /// 执行资源过滤器。在执行管道的其余部分后调用。
  7. /// </summary>
  8. /// <param name="context"></param>
  9. public void OnResourceExecuted(ResourceExecutedContext context)
  10. {
  11. Console.WriteLine("OnResourceExecuted");
  12. }
  13. /// <summary>
  14. /// 执行资源筛选器。 在执行管道的其余部分之前调用。
  15. /// </summary>
  16. /// <param name="context"></param>
  17. public void OnResourceExecuting(ResourceExecutingContext context)
  18. {
  19. Console.WriteLine("OnResourceExecuting");
  20. }
  21. }

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

  1. [HttpGet(Name = "GetWeatherForecast")]
  2. //[WeatherForecastActionFilter(Order =1)]
  3. [CustomerResourceFilter]
  4. public IEnumerable<WeatherForecast> Get()
  5. {
  6. Console.WriteLine("GetWeatherForecast开始");
  7. return Enumerable.Range(1, 5).Select(index => new WeatherForecast
  8. {
  9. Date = DateTime.Now.AddDays(index),
  10. TemperatureC = Random.Shared.Next(-20, 55),
  11. Summary = Summaries[Random.Shared.Next(Summaries.Length)]
  12. })
  13. .ToArray();
  14. }

1664083323159.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该操作关联的操作的最有效策略 (最具体的) 。