操作筛选器 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>();
});

浙公网安备 33010602011771号