ASP.NET Core Action Filter


前言

Action FilterASP.NET Core 中一种强大的机制,允许在请求处理管道的特定阶段插入逻辑。

一、Action Filter 的作用

  • 横切关注点:处理日志、验证、性能监控等与业务逻辑无关的代码。
  • 执行阶段
    • OnActionExecutingAction 方法执行前。
    • OnActionExecutedAction 方法执行后。

二、创建 Action Filter

1.同步过滤器

  1. 继承 ActionFilterAttribute,重写相关方法:
     public class MyLogActionFilter: ActionFilterAttribute
     {
         public override void OnActionExecuting(ActionExecutingContext context)
         {
             // Action 执行前
             Console.WriteLine($"执行前: {context.ActionDescriptor.DisplayName}");
         }
         public override void OnActionExecuted(ActionExecutedContext context)
         {
             // Action 执行后
             Console.WriteLine($"执行后: {context.ActionDescriptor.DisplayName}");
         }
     }
    

2.异步过滤器

  1. 实现 IAsyncActionFilter,使用中间件模式:
     public class MyLogActionFilterAsync : IAsyncActionFilter
     {
         public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
         {
             //Action执行前
             Console.WriteLine("执行前处理");
             var s = await next();//执行Action
             //Action执行后
             Console.WriteLine("执行后处理");
         }
     }
    

三、注册过滤器

1.全局注册

  1. 在 Program.cs 中全局生效:
    builder.Services.AddControllers(opt =>
    {
        opt.Filters.Add<MyLogActionFilter>();
        opt.Filters.Add<MyLogActionFilterAsync>();
        opt.Filters.Add<ExecutionTimeFilter>();
    });
    

2.控制器或 Action 级别注册

  1. 通过特性标注,需确保过滤器已注入 DI 容器:
    [ServiceFilter(typeof(MyLogActionFilter))] // 需注册服务
    [TypeFilter(typeof(MyLogActionFilterAsync))] // 自动解析依赖
    public class HomeController : Controller
    {
        [ServiceFilter(typeof(AnotherFilter))]
        public IActionResult Index() => View();
    }
    
  2. 在 Program.cs 中注册服务:
    builder.Services.AddScoped<MyLogActionFilter>();
    builder.Services.AddScoped<MyLogActionFilterAsync>();
    

四、实际应用场景

1.记录执行时间

  1. 示例:
    public class ExecutionTimeFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(
            ActionExecutingContext context,
            ActionExecutionDelegate next)
        {
            var sw = Stopwatch.StartNew();
            await next();
            sw.Stop();
            
            var actionName = context.ActionDescriptor.DisplayName;
            Console.WriteLine($"{actionName} 耗时: {sw.ElapsedMilliseconds}ms");
        }
    }
    

2.参数验证

  1. 示例:
    public class ValidateModelFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                context.Result = new BadRequestObjectResult(context.ModelState);
            }
        }
    }
    

五、注意事项

  • 执行顺序:通过 Order 属性或实现 IOrderedFilter 控制。
  • 短路请求:在 OnActionExecuting 中设置 context.Result 可跳过后续逻辑。
  • 依赖注入:需通过 ServiceFilterTypeFilter 解析构造函数依赖。
  • 异步 vs 同步:异步过滤器更适合 I/O 操作,避免阻塞线程。

六、常见问题

  • 过滤器未生效:检查是否注册到正确的级别(全局、控制器、Action)。
  • 依赖注入失败:确保过滤器类已在 Program.cs 中注册。
  • 循环依赖:避免过滤器间相互依赖。

总结

通过合理使用 Action Filter,可以显著提升代码的可维护性和复用性。建议根据场景选择合适的同步/异步实现,并注意生命周期管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值