操作筛选器 filter
每次 ASP.NET Core 中控件器的操作方法执行的时候,操作筛选器都会被执行,我们可以在操作方法执行之前和执行之后执行一些代码,完成特定的功能。
public class MyActionFilter1 : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { } }
操作筛选器实现 IAsyncActionFilter 接口,接中中定义了 OnActionExecutionAsync 方法
其中Context参数,代表Action执行的上下文对象,从context 中我们可以获取请求的路径、参数值等信息,next参数代表下一个要执行的操作筛选器。一个项目中可以注册多个操作筛选器,这些操作筛选器组成一个链条,上一个筛选器执行完了再执行下一个。
next()就是用来指向下一个操作筛选器的委托,如果当前的操作筛选器是最后一个筛选器的话,next就会执行被真正调用的方法。
下面是两个操作筛选器的示例:
public class MyActionFilter1 : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Console.WriteLine("MyActionFilter 1:开始执行"); ActionExecutedContext r = await next();//执行下一个筛选器,如果没了,那就执行实际的方法 if (r.Exception != null) Console.WriteLine("MyActionFilter 1:执行失败"); else Console.WriteLine("MyActionFilter 1:执行成功"); } }
public class MyActionFilter2 : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Console.WriteLine("MyActionFilter 2:开始执行"); ActionExecutedContext r = await next();//之后没筛选器了,执行被调用的方法 if (r.Exception != null) Console.WriteLine("MyActionFilter 2:执行失败"); else Console.WriteLine("MyActionFilter 2:执行成功"); } }
注册这两个筛选器。特别注意:注册的顺序很关键,先注册的先执行,后注册的后执行
builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyActionFilter1>(); options.Filters.Add<MyActionFilter2>(); });
执行控制器方法,执行结果:
调整操作筛选器注册顺序,执行结果:
builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyActionFilter2>(); options.Filters.Add<MyActionFilter1>(); });