前言:什么是操作筛选器
操作筛选器是 ASP.NET Core Web API 中的一种过滤器,用于在执行控制器操作(Action)之前或之后执行一些代码,完成特定的功能,比如执行日志记录、身份验证、授权、异常处理等通用的处理逻辑。
每次 ASP.NET Core Web API 中控制器的操作方法被执行的时候,操作筛选器都会被执行,所以操作筛选器默认是应用于所有控制器的操作方法的。
一个项目中可以注册多个操作筛选器,这些操作筛选器组成一个链,上一个筛选器执行完了再执行下一个。next
就是一个用来指向下一个操作筛选器的委托,如果当前的操作筛选器是最后一个筛选器的话,next
就会执行要执行的操作方法。
操作筛选器跟前文(见《如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute》)讲过的 ActionFilterAttribute 比较相似,ActionFilterAttribute 是用于将操作筛选器逻辑应用于控制器操作的一种方式,而操作筛选器是一种更广泛的概念,可以说,ActionFilterAttribute 是操作筛选器的一种特定实现方式,它通过特性的方式将操作筛选器逻辑应用于控制器操作。
Step By Step 步骤
-
创建一个 ASP.NET Core Web API 项目
-
编写两个自定义的操作筛选器 MyActionFilter1 和 MyActionFilter2,实现 IAsyncActionFilter 接口(注意看代码中的注释)
using Microsoft.AspNetCore.Mvc.Filters; public class MyActionFilter1 : IAsyncActionFilter { // context 参数代表 Action 执行的上下文对象,从 context 中我们可以获取请求的路径、参数值等信息 // next 参数代表下一个要执行的操作筛选器 public async Task OnActionExecutionAsync( ActionExecutingContext context, ActionExecutionDelegate next) { // next 之前的代码是在操作方法执行之前要执行的代码 Console.WriteLine("MyActionFilter 1:开始执行"); // 用 next 来执行下一个操作筛选器, // 如果这是最后一个操作筛选器,它就会执行实际的操作方法 // next 的返回值是操作方法的执行结果,返回值是 ActionExecutedContext 类型的。 // 如果操作方法执行的时候出现了未处理异常, // 那么 ActionExecutedContext 的 Exception 属性就是异常对象, // ActionExecutedContext 的 Result 属性就是操作方法的执行结果。 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:执行成功"); } } }
-
打开 Program.cs,注册这两个操作筛选器
using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 注册操作筛选器服务 builder.Services.Configure
(options => { options.Filters.Add (); options.Filters.Add (); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); -
打开控制器,增加一个用于测试的操作方法
using Microsoft.AspNetCore.Mvc; namespace 操作筛选器.Controllers { [ApiController] [Route("[controller]/[action]")] public class TestController : ControllerBase { [HttpGet] public string GetData() { Console.WriteLine("执行GetData"); return "yzk"; } } }
测试运行和结果
执行顺序:
MyActionFilter 1:开始执行
MyActionFilter 2:开始执行
执行GetData
MyActionFilter 2:执行成功
MyActionFilter 1:执行成功
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容