当前位置:首页 > C# > 正文

掌握 ASP.NET Core 过滤器(深入浅出 ActionFilter 实战教程)

ASP.NET Core 开发中,过滤器(Filters)是一个非常强大的机制,它允许我们在请求处理管道的特定阶段插入自定义逻辑。其中,ActionFilter 是最常用的一种过滤器类型,用于在控制器的 Action 方法执行前后运行代码。

本教程将带你从零开始理解并实现一个简单的 ActionFilter,即使你是编程小白,也能轻松上手!

掌握 ASP.NET Core 过滤器(深入浅出 ActionFilter 实战教程)  过滤器 Web开发 第1张

什么是 ActionFilter?

ActionFilter 是 ASP.NET Core 中四种主要过滤器之一(其他包括 AuthorizationFilter、ResourceFilter 和 ExceptionFilter)。它的作用是在 Action 方法执行前执行后插入自定义逻辑。

常见用途包括:

  • 记录日志(例如:记录用户访问了哪个接口)
  • 修改 Action 的输入参数或返回结果
  • 性能监控(记录执行时间)
  • 统一处理响应格式

如何创建一个 ActionFilter?

在 ASP.NET Core 中,你可以通过两种方式创建 ActionFilter:

  1. 实现 IActionFilter 接口
  2. 继承 ActionFilterAttribute 抽象类(推荐,更简洁)

下面我们使用第二种方式来创建一个记录 Action 执行时间的日志过滤器。

步骤 1:创建自定义 ActionFilter

using Microsoft.AspNetCore.Mvc.Filters;using System.Diagnostics;public class LogActionExecutionTimeAttribute : ActionFilterAttribute{    private Stopwatch _stopwatch;    public override void OnActionExecuting(ActionExecutingContext context)    {        // Action 执行前:启动计时器        _stopwatch = Stopwatch.StartNew();        Console.WriteLine($"开始执行 {context.ActionDescriptor.DisplayName}");    }    public override void OnActionExecuted(ActionExecutedContext context)    {        // Action 执行后:停止计时器并输出耗时        _stopwatch.Stop();        var elapsedMs = _stopwatch.ElapsedMilliseconds;        Console.WriteLine($"{context.ActionDescriptor.DisplayName} 执行完成,耗时 {elapsedMs} 毫秒");    }}

步骤 2:注册并使用过滤器

你可以在三个级别应用这个过滤器:

  • 全局级别:对所有控制器生效
  • 控制器级别:对整个控制器的所有 Action 生效
  • Action 级别:只对某个特定方法生效

下面展示如何在 Action 上使用:

[ApiController][Route("[controller]")]public class HomeController : ControllerBase{    [HttpGet]    [LogActionExecutionTime] // ← 在这里应用过滤器    public IActionResult Index()    {        return Ok(new { message = "Hello from ASP.NET Core!" });    }}

如果你想全局应用,可以在 Program.cs 中注册:

// Program.csvar builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers(options =>{    options.Filters.Add<LogActionExecutionTimeAttribute>(); // 全局注册});var app = builder.Build();app.MapControllers();app.Run();

为什么使用 ActionFilter?

使用 ActionFilter 可以让你的代码更加模块化、可复用,并避免在每个 Action 中重复编写相同的逻辑(比如日志、权限检查等)。这正是 Web开发 中“关注点分离”原则的体现。

通过合理使用过滤器,你可以显著提升 ASP.NET Core 应用的可维护性和扩展性。

小结

本教程介绍了 ActionFilter 的基本概念、创建方法和应用场景。你已经学会了如何自定义一个记录执行时间的过滤器,并将其应用到控制器或全局范围。

记住,过滤器 是 ASP.NET Core 中实现横切关注点(Cross-cutting Concerns)的关键工具。掌握它,你的 Web开发 技能将更上一层楼!

关键词:ASP.NET Core, ActionFilter, 过滤器, Web开发