asp.net core2 mvc 基础教程--过滤器

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

同步版:

public class LogResourceFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        Console.WriteLine("Executing Resource Filter!");
    }
    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        Console.WriteLine("Executed Resource Filter...");
    }
}

异步版:

public class LogAsyncResourceFilter : Attribute, IAsyncResourceFilter
{
    public async Task OnResourceExecutionAsync(
        ResourceExecutingContext context, 
        ResourceExecutionDelegate next)
    {
        Console.WriteLine("Executing Resource Filter!");
        var executedContext = await next();
        Console.WriteLine("Executed Resource Filter...");
    }
}

应用 Filter

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

配置全局 Filter:

services.AddMvc(options =>
{
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
    //options.Filters.Add(new LogResourceFilter());
    //options.Filters.Add(typeof(LogAsyncResourceFilter));
    options.Filters.Add<LogResourceFilter>();
});

效果:

image.png

几种 Filter 的执行顺序:

image.png

原文地址:https://www.cnblogs.com/cqqinjie/p/13321891.html