过滤器的作⽤是在 Action ⽅法执⾏前或执⾏后做⼀些加⼯处理。使⽤过滤器可以避免Action⽅法的重复代码,例如,您可以使⽤异常过滤器合并异常处理的代码。过滤器如何⼯作?
过滤器在 MVC Action 调⽤管道中运⾏,有时称为过滤器管道。MVC选择要执⾏的Action⽅法后,才会执⾏过滤器管道:
实现
过滤器同时⽀持同步和异步两种不同的接⼝定义。您可以根据执⾏的任务类型,选择同步或异步实现。
同步过滤器定义OnStageExecuting和OnStageExecuted⽅法,会在管道特定阶段之前和之后运⾏代码的。例如IActionFilter过滤器,在调⽤Action⽅法之前调⽤OnActionExecuting,在Action⽅法之回之后调⽤OnActionExecuted:
public class SampleActionFilter : IActionFilter {
public void OnActionExecuting(ActionExecutingContext context) {
// do something before the action executes }
public void OnActionExecuted(ActionExecutedContext context) {
// do something after the action executes } }
异步过滤器定义了⼀个OnStageExecutionAsync⽅法。该⽅法提供了FilterTypeExecutionDelegate的委托,当调⽤该委托时会执⾏具体管道阶段的⼯作。例如,ActionExecutionDelegate⽤于调⽤Action⽅法,您可以在调⽤它之前和之后执⾏代码。
public class SampleAsyncActionFilter : IAsyncActionFilter {
public async Task OnActionExecutionAsync( ActionExecutingContext context, ActionExecutionDelegate next) {
// do something before the action executes await next();
// do something after the action executes } }
您可以在单个类中实现多个过滤器接⼝。例如,抽象类实现了IActionFilter和IResultFilter,以及与它们对应的异步接⼝。提⽰
您不需要同时实现两种过滤器接⼝,要么是同步的,要么是异步的。框架⾸先检查过滤器是否实现了异步接⼝,如果是,直接执⾏异步⽅法。如果不是,它会执⾏同步接⼝的⽅法。如果在⼀个类上同时实现两种接⼝,则只会调⽤异步⽅法。当使⽤像ActionFilterAttribute这类抽象类时,您只需要覆盖过滤器的同步⽅法或异步⽅法。过滤器类型
ASP.NET Core 有以下五种类型的过滤器,每个过滤器类型在过滤器管道中的不同阶段执⾏:1.Authorization Filter
授权过滤器 在过滤器管道中第⼀个执⾏,通常⽤于验证当前请求的合法性,不合法后⾯的管道会直接跳过。它们只有⼀个Before⽅法,不像其它⼤多数过滤器⽀持前置阶段⽅法和后置阶段⽅法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。2.Resource Filter
资源过滤器是第⼆个运⾏,在 Authorization Filter 之后,Model Binding 之前执⾏。在性能⽅⾯,资源过滤器在实现缓存或截断过滤器管道尤为重要。3.Action Filter
使⽤率最⾼的过滤器,在调⽤ Acioin ⽅法之前和之后执⾏代码。跟 Resource Filter 很类似,但 Model Binding 在之后执⾏。4.Exception Filter
⽤于为应⽤程序执⾏异常处理策略。5.Result Filter
当 Action 执⾏完成后,最后会执⾏过滤器。⽤于处理ActionResult结果输出策略。过滤器运⾏顺序
ASP.NET Core 的每个请求都会先经过已注册的Middleware,接着才会执⾏过滤器:同类型的过滤器都会以先进后出的⽅式执⾏。
⿈⾊箭头是正常情況流程灰⾊箭头是异常处理流程过滤器的作⽤域与执⾏顺序
过滤器具有三种不同级别的作⽤域。您可以通过Attribute将过滤器注册到指定控制器或 Action ⽅法;您也可以在Startup类的ConfigureServices⽅法中将过滤器注册到MvcOptions.Filters的集合中作为全局过滤器(对所有的控制器和Action⽅法均有效):
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddMvc(options => {
options.Filters.Add(new AddHeaderAttribute(\"GlobalAddHeader\ \"Result filter added to MvcOptions.Filters\")); // an instance options.Filters.Add(typeof(SampleActionFilter)); // by type
options.Filters.Add(new SampleGlobalActionFilter()); // an instance });
services.AddScoped ⽰例来⾃于默认执⾏顺序 当管道的某个阶段存在多个过滤器时,过滤器执⾏的默认顺序由作⽤域确定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action⽅法过滤器。 以下⽰例是同步 Action 过滤器调⽤的顺序:序号过滤器作⽤域123456提⽰ 每个控制器的基类Controller包含OnActionExecuting和OnActionExecuted⽅法。其中OnActionExecuting在所有过滤器之前调⽤,OnActionExecuted在所有过滤器之后调⽤。覆盖默认执⾏顺序 您可以通过实现IOrderedFilter接⼝来覆盖默认的执⾏顺序。此接⼝公开了Order属性表⽰优先级,以确定执⾏顺序;具有较低Order值的过滤器将在具有较⾼Order值的过滤器之前执⾏前置⽅法;具有较低Order值的过滤器将在具有较⾼Order值的过滤器之后执⾏后置⽅法。 您可以使⽤构造函数参数设置Order属性: [MyFilter(Name = \"Controller Level Attribute\ 过滤器⽅法OnActionExecutingOnActionExecutingOnActionExecutingOnActionExecutedOnActionExecutedOnActionExecuted GlobalControllerMethodMethodControllerGlobal 如果您将上述⽰例中 Action 过滤器的Order设置为1,将控制器和全局过滤器的Order属性分别设置为2和3,则执⾏顺序将与默认相反。 序号过滤器作⽤域Order 属性123456 MethodControllerGlobalGlobalControllerMethod 123321 过滤器⽅法OnActionExecutingOnActionExecutingOnActionExecutingOnActionExecutedOnActionExecutedOnActionExecuted 过滤器执⾏时,Order属性的优先级⾼于作⽤域。过滤器⾸先按Order属性排序,然后再按作⽤域排序。所有内置过滤器实现IOrderedFilter接⼝并将Order值默认设置为0;因此,除⾮设置Order属性为⾮零值,否则按作⽤域的优先级执⾏。总结 今天我们已经了解了关于过滤器基本知识,在下⼀篇博客中,我们将介绍内置过滤器、过滤的使⽤、依赖注⼊、取消与截断等知识,谢谢! 以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。 因篇幅问题不能全部显示,请点此查看更多更全内容