Visual

25 过滤器.mp4 (45.45MB)

一句话的事儿

  • 就是在Https请求前进行验证,决定是否进入下一个管道;
  • 筛选器的接口来自于IFilterMetadata,且下面没有任何方法,这是由于每一个筛选器都是需要客制化的

    Filter

  • 专用于 MVC

  • 可以在 MVC 的请求管道里添加逻辑
    • 之前、之后
  • Cross-cutting concerns(贯穿特性)
    • 避免代码重复
  • 常用场景
    • 授权
    • 需要 HTTPS

注:Filter 是专用于 MVC 管道的,不同于之前讲的 ASP.NET Core 的管道。

MVC 管道:
image.png

Filter 种类:

  • 授权
  • 资源
  • Action
  • 异常
  • Result

实现 Filter

  • IFilterMetadata
    • IAuthorizationFilter, IAsyncAuthorizationFilter
    • IResourceFilter(这几个也都有异步版本)
    • IActionFilter
    • IExceptionFilter
    • IResultFilter

:::info

  • Attribute继承它的原因在于使用特性的方式实现
  • IResourceFilter继承这个接口的原因是该接口已经继承了IFilterMetadata,所以不需要直接继承该接口 ::: image.png
    image.png
    同步版:

    1. public class LogResourceFilter : Attribute, IResourceFilter
    2. {
    3. public void OnResourceExecuting(ResourceExecutingContext context)
    4. {
    5. Console.WriteLine("Executing Resource Filter!");
    6. }
    7. public void OnResourceExecuted(ResourceExecutedContext context)
    8. {
    9. Console.WriteLine("Executed Resource Filter...");
    10. }
    11. }

异步版:

  1. public class LogAsyncResourceFilter : Attribute, IAsyncResourceFilter
  2. {
  3. public async Task OnResourceExecutionAsync(
  4. ResourceExecutingContext context,
  5. ResourceExecutionDelegate next)
  6. {
  7. Console.WriteLine("Executing Resource Filter!");
  8. var executedContext = await next();
  9. Console.WriteLine("Executed Resource Filter...");
  10. }
  11. }

应用 Filter

  • Action:通过特性标注
  • Controller:通过特性标注
  • 全局:通过 Startup 配置

配置全局 Filter:

  1. services.AddMvc(options =>
  2. {
  3. options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
  4. //options.Filters.Add(new LogResourceFilter());
  5. //options.Filters.Add(typeof(LogAsyncResourceFilter));
  6. options.Filters.Add<LogResourceFilter>();
  7. });

效果:
image.png

几种 Filter 的执行顺序:
image.png