文章目录
前言
Action Filter 是 ASP.NET Core 中一种强大的机制,允许在请求处理管道的特定阶段插入逻辑。
一、Action Filter 的作用
- 横切关注点:处理日志、验证、性能监控等与业务逻辑无关的代码。
- 执行阶段:
- OnActionExecuting:Action 方法执行前。
- OnActionExecuted:Action 方法执行后。
二、创建 Action Filter
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.异步过滤器
- 实现 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.全局注册
- 在 Program.cs 中全局生效:
builder.Services.AddControllers(opt => { opt.Filters.Add<MyLogActionFilter>(); opt.Filters.Add<MyLogActionFilterAsync>(); opt.Filters.Add<ExecutionTimeFilter>(); });
2.控制器或 Action 级别注册
- 通过特性标注,需确保过滤器已注入 DI 容器:
[ServiceFilter(typeof(MyLogActionFilter))] // 需注册服务 [TypeFilter(typeof(MyLogActionFilterAsync))] // 自动解析依赖 public class HomeController : Controller { [ServiceFilter(typeof(AnotherFilter))] public IActionResult Index() => View(); }
- 在 Program.cs 中注册服务:
builder.Services.AddScoped<MyLogActionFilter>(); builder.Services.AddScoped<MyLogActionFilterAsync>();
四、实际应用场景
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.参数验证
- 示例:
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 可跳过后续逻辑。
- 依赖注入:需通过 ServiceFilter 或 TypeFilter 解析构造函数依赖。
- 异步 vs 同步:异步过滤器更适合 I/O 操作,避免阻塞线程。
六、常见问题
- 过滤器未生效:检查是否注册到正确的级别(全局、控制器、Action)。
- 依赖注入失败:确保过滤器类已在 Program.cs 中注册。
- 循环依赖:避免过滤器间相互依赖。
总结
通过合理使用 Action Filter,可以显著提升代码的可维护性和复用性。建议根据场景选择合适的同步/异步实现,并注意生命周期管理。