翼度科技»论坛 编程开发 .net 查看内容

在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21

前言:什么是操作筛选器

操作筛选器是 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 接口(注意看代码中的注释
    1. using Microsoft.AspNetCore.Mvc.Filters;
    2. public class MyActionFilter1 : IAsyncActionFilter
    3. {
    4.         // context 参数代表 Action 执行的上下文对象,从 context 中我们可以获取请求的路径、参数值等信息
    5.         // next 参数代表下一个要执行的操作筛选器
    6.         public async Task OnActionExecutionAsync(
    7.                 ActionExecutingContext context,
    8.                 ActionExecutionDelegate next)
    9.         {
    10.                 // next 之前的代码是在操作方法执行之前要执行的代码
    11.                 Console.WriteLine("MyActionFilter 1:开始执行");
    12.                 // 用 next 来执行下一个操作筛选器,
    13.                 // 如果这是最后一个操作筛选器,它就会执行实际的操作方法
    14.                 // next 的返回值是操作方法的执行结果,返回值是 ActionExecutedContext 类型的。
    15.                 // 如果操作方法执行的时候出现了未处理异常,
    16.                 // 那么 ActionExecutedContext 的 Exception 属性就是异常对象,
    17.                 // ActionExecutedContext 的 Result 属性就是操作方法的执行结果。
    18.                 ActionExecutedContext r = await next();
    19.                
    20.                 // 以下代码则是在操作方法执行之后要执行的代码
    21.                 if (r.Exception != null)
    22.                 {
    23.                         Console.WriteLine("MyActionFilter 1:执行失败");
    24.                 }
    25.                 else
    26.                 {
    27.                         Console.WriteLine("MyActionFilter 1:执行成功");
    28.                 }
    29.         }
    30. }
    31. public class MyActionFilter2 : IAsyncActionFilter
    32. {
    33.         public async Task OnActionExecutionAsync(
    34.                 ActionExecutingContext context,
    35.                 ActionExecutionDelegate next)
    36.         {
    37.                 Console.WriteLine("MyActionFilter 2:开始执行");
    38.                 ActionExecutedContext r = await next();
    39.                 if (r.Exception != null)
    40.                 {
    41.                         Console.WriteLine("MyActionFilter 2:执行失败");
    42.                 }
    43.                 else
    44.                 {
    45.                         Console.WriteLine("MyActionFilter 2:执行成功");
    46.                 }
    47.         }
    48. }
    复制代码
  • 打开 Program.cs,注册这两个操作筛选器
    1. using Microsoft.AspNetCore.Mvc;
    2. var builder = WebApplication.CreateBuilder(args);
    3. // Add services to the container.
    4. builder.Services.AddControllers();
    5. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    6. builder.Services.AddEndpointsApiExplorer();
    7. builder.Services.AddSwaggerGen();
    8. // 注册操作筛选器服务
    9. builder.Services.Configure<MvcOptions>(options => {
    10.         options.Filters.Add<MyActionFilter1>();
    11.         options.Filters.Add<MyActionFilter2>();
    12. });
    13. var app = builder.Build();
    14. // Configure the HTTP request pipeline.
    15. if (app.Environment.IsDevelopment())
    16. {
    17.         app.UseSwagger();
    18.         app.UseSwaggerUI();
    19. }
    20. app.UseHttpsRedirection();
    21. app.UseAuthorization();
    22. app.MapControllers();
    23. app.Run();
    复制代码
  • 打开控制器,增加一个用于测试的操作方法
    1. using Microsoft.AspNetCore.Mvc;
    2. namespace 操作筛选器.Controllers
    3. {
    4.         [ApiController]
    5.         [Route("[controller]/[action]")]
    6.         public class TestController : ControllerBase
    7.         {
    8.                 [HttpGet]
    9.                 public string GetData()
    10.                 {
    11.                         Console.WriteLine("执行GetData");
    12.                         return "yzk";
    13.                 }
    14.         }
    15. }
    复制代码
测试运行和结果
  1. 执行顺序:
  2. MyActionFilter 1:开始执行
  3. MyActionFilter 2:开始执行
  4. 执行GetData
  5. MyActionFilter 2:执行成功
  6. MyActionFilter 1:执行成功
复制代码
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!


来源:https://www.cnblogs.com/JackyGz/p/18438519
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具