25 过滤器.mp4 (45.45MB)

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

同步版:

  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