原生Filter
类型
.Net中Filter都是以特性的形式存在,有如下五类:
- AuthorizationFilters
- ReousrceFilters
- ActionFilters
- ExceptionFilters
- ResultFilters
AuthorizationFilters
常做权限验证;
ReousrceFilters
常做缓存;
ActionFilters
常做模型验证、日志记录;
ExceptionFilters
异常捕获;
作用范围
只能捕获ActionFilter及ActionExecution时的报错.
例子
OnException(ExceptionContext context)
{
//记录日志
}
ResultFilters
处理返回结果。
作用范围
仅Result不为空时才能够执行,若短路器执行或管道中抛出异常,则会跳过ResultFilter.
注册
注册方式
- 方法注册
将特性注解在方法上;
- 类注册
将特性注解在类上;
- 全局注册
在注册Controller时使用委托注册,如:
Builder.Service.AddController( o => o.Filter.Add<CumFilter>());
## 优先级
不同类型Filter按管道模型顺序执行,相同类型的 全局>类>方法;
也可以再注册时指定 add
短路器
当Context.Result被赋值时,将会跳过后续的管线步骤,直接返回结果,这一机制叫做短路器.
利用短路器实现缓存:
在ResourceFilter中:
public class ResourceFilter : Attribute, IResourceFilter
{
private Static Dictionary< string, object > _dirCache = new Dictionary< string, object >();
public void OnResourceExecuting(esourceExecutingContext context)
{
var path = context.HttpContext.Request.Path;
_dirCache[path] = context.Result as ObjectReslut;
}
public void OnResourceExxcuted(ResourceExecutedContext context)
{
var path = context.HttpContext.Request.Path;
if( _dirCache.ContainsKey(path) )
{
context.Result = _dirCache[path] as ObjectReslut;
}
}
}
[TypeFilter(typeOf(xxxActionFilterAttribute))]
[ServiceFilter(typeOf(xxxActionFilterAttribute))] // 使用此条需在build中注册改过滤器及其需要注入的参数;