操作筛选器 filter
每次 ASP.NET Core 中控件器的操作方法执行的时候,操作筛选器都会被执行,我们可以在操作方法执行之前和执行之后执行一些代码,完成特定的功能。
1 2 3 4 5 6 | public class MyActionFilter1 : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { } } |
操作筛选器实现 IAsyncActionFilter 接口,接中中定义了 OnActionExecutionAsync 方法
其中Context参数,代表Action执行的上下文对象,从context 中我们可以获取请求的路径、参数值等信息,next参数代表下一个要执行的操作筛选器。一个项目中可以注册多个操作筛选器,这些操作筛选器组成一个链条,上一个筛选器执行完了再执行下一个。
next()就是用来指向下一个操作筛选器的委托,如果当前的操作筛选器是最后一个筛选器的话,next就会执行被真正调用的方法。
下面是两个操作筛选器的示例:
1 2 3 4 5 6 7 8 9 10 11 12 | 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:执行成功" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 | 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:执行成功" ); } } |
注册这两个筛选器。特别注意:注册的顺序很关键,先注册的先执行,后注册的后执行
1 2 3 4 5 | builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyActionFilter1>(); options.Filters.Add<MyActionFilter2>(); }); |
执行控制器方法,执行结果:
调整操作筛选器注册顺序,执行结果:
1 2 3 4 5 | builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyActionFilter2>(); options.Filters.Add<MyActionFilter1>(); }); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)