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 的执行顺序: