Visual
一句话的事儿
- 就是在Https请求前进行验证,决定是否进入下一个管道;
筛选器的接口来自于IFilterMetadata,且下面没有任何方法,这是由于每一个筛选器都是需要客制化的
Filter
专用于 MVC
- 可以在 MVC 的请求管道里添加逻辑
- 之前、之后
- Cross-cutting concerns(贯穿特性)
- 避免代码重复
- 常用场景
- 授权
- 需要 HTTPS
注:Filter 是专用于 MVC 管道的,不同于之前讲的 ASP.NET Core 的管道。
MVC 管道:
Filter 种类:
- 授权
- 资源
- Action
- 异常
- Result
实现 Filter
- IFilterMetadata
- IAuthorizationFilter, IAsyncAuthorizationFilter
- IResourceFilter(这几个也都有异步版本)
- IActionFilter
- IExceptionFilter
- IResultFilter
:::info
- Attribute继承它的原因在于使用特性的方式实现
IResourceFilter继承这个接口的原因是该接口已经继承了IFilterMetadata,所以不需要直接继承该接口 :::


同步版: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>();});
效果:
几种 Filter 的执行顺序:

