媒介:什么是操作筛选器
操作筛选器是 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<MvcOptions>(options => {
- options.Filters.Add<MyActionFilter1>();
- options.Filters.Add<MyActionFilter2>();
- });
- 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年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理履历和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |