当管道的某个阶段存在多个过滤器时,过滤器执行的默认顺序由作用域确定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action方法过滤器。
以下示例是同步 Action 过滤器调用的顺序:
序号
过滤器作用域
过滤器方法
 
1   
Global   
OnActionExecuting   
 
2   
Controller   
OnActionExecuting   
 
3   
Method   
OnActionExecuting   
 
4   
Method   
OnActionExecuted   
 
5   
Controller   
OnActionExecuted   
 
6   
Global   
OnActionExecuted   
 
提示
每个控制器的基类Controller包含OnActionExecuting和OnActionExecuted方法。其中OnActionExecuting在所有过滤器之前调用,OnActionExecuted在所有过滤器之后调用。
覆盖默认执行顺序
您可以通过实现IOrderedFilter接口来覆盖默认的执行顺序。此接口公开了Order属性表示优先级,以确定执行顺序;具有较低Order值的过滤器将在具有较高Order值的过滤器之前执行前置方法;具有较低Order值的过滤器将在具有较高Order值的过滤器之后执行后置方法。
您可以使用构造函数参数设置Order属性:
[MyFilter(Name = "Controller Level Attribute", Order=1)]
如果您将上述示例中 Action 过滤器的Order设置为1,将控制器和全局过滤器的Order属性分别设置为2和3,则执行顺序将与默认相反。
序号
过滤器作用域
Order 属性
过滤器方法
 
1   
Method   
1   
OnActionExecuting   
 
2   
Controller   
2   
OnActionExecuting   
 
3   
Global   
3   
OnActionExecuting   
 
4   
Global   
3   
OnActionExecuted   
 
5   
Controller   
2   
OnActionExecuted   
 
6   
Method   
1   
OnActionExecuted   
 
过滤器执行时,Order属性的优先级高于作用域。过滤器首先按Order属性排序,然后再按作用域排序。所有内置过滤器实现IOrderedFilter接口并将Order值默认设置为0;因此,除非设置Order属性为非零值,否则按作用域的优先级执行。
总结
今天我们已经了解了关于过滤器基本知识,在下一篇博客中,我们将介绍内置过滤器、过滤的使用、依赖注入、取消与截断等知识,谢谢!
