ASP.NET Core中的过滤器是什么?如何应用?

来源:站长源码作者:香港程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《ASP.NET Core中的过滤器是什么?如何应用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《ASP.NET Core中的过滤器是什么?如何应用?》有用,将其分享出去将是对创作者最好的鼓励。

ASP.NET Core中的过滤器是运行在ASP.NET Core请求处理管道中的特定组件,用于在控制器操作执行的前后插入自定义逻辑,处理如授权、日志记录、异常处理、参数验证等横切关注点,和中间件不同,过滤器可以访问到MVC上下文相关的信息,比如控制器、操作方法、参数等。

ASP.NET Core中的过滤器是什么?如何应用?

过滤器的核心类型

ASP.NET Core内置了多种过滤器类型,按照执行顺序从先到后排列如下:

  • 授权过滤器(Authorization Filter):最先执行,用于判断当前请求是否有权限访问对应资源,没有权限会直接返回错误响应。
  • 资源过滤器(Resource Filter):在授权过滤器之后、模型绑定之前执行,也可以在操作执行之后、结果执行之前执行,常用于缓存处理、资源访问统计等场景。
  • 操作过滤器(Action Filter):在模型绑定完成之后、操作执行之前执行,也可以在操作执行之后、结果执行之前执行,常用作参数验证、操作执行耗时统计等。
  • 异常过滤器(Exception Filter):在操作执行过程中或者结果执行过程中出现异常时触发,用于统一处理异常,返回友好的错误响应。
  • 结果过滤器(Result Filter):在操作结果执行前后触发,用于处理操作返回的结果,比如格式化响应内容、添加响应头等。

实现自定义过滤器

实现操作过滤器示例

操作过滤器可以实现IActionFilter接口或者继承ActionFilterAttribute基类,后者更常用,因为它同时实现了接口和Attribute,可以直接标注在控制器或者操作方法上。

下面是一个记录操作执行耗时的操作过滤器实现:

using Microsoft.AspNetCore.Mvc.Filters;
using System.Diagnostics;

public class ExecutionTimeFilter : ActionFilterAttribute
{
    private Stopwatch _stopwatch;

    // 操作执行前触发
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        _stopwatch = Stopwatch.StartNew();
        // 可以在这里获取操作参数进行验证
        // var parameters = context.ActionArguments;
    }

    // 操作执行后触发
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        _stopwatch.Stop();
        var controllerName = context.Controller.GetType().Name;
        var actionName = context.ActionDescriptor.DisplayName;
        var executionTime = _stopwatch.ElapsedMilliseconds;
        // 实际开发中可以将日志写入日志系统
        Debug.WriteLine($"控制器:{controllerName},操作:{actionName},执行耗时:{executionTime}毫秒");
    }
}

实现异常过滤器示例

异常过滤器需要实现IExceptionFilter接口或者继承ExceptionFilterAttribute基类,用于在操作执行过程中出现异常时统一处理。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class CustomExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        // 获取异常信息
        var exception = context.Exception;
        var message = exception.Message;
        // 构造错误响应
        var result = new ObjectResult(new
        {
            Code = 500,
            Message = "服务器处理请求时出现错误",
            Detail = message
        })
        {
            StatusCode = 500
        };
        // 设置结果,标记异常已处理
        context.Result = result;
        context.ExceptionHandled = true;
    }
}

过滤器的注册方式

过滤器有几种不同的注册方式,不同的注册方式生效的范围不同。

1. 全局注册

在程序启动配置服务的时候,通过AddControllers方法的选项添加过滤器,这种方式注册的过滤器会对所有控制器和操作生效。

var builder = WebApplication.CreateBuilder(args);

// 添加控制器服务,注册全局过滤器
builder.Services.AddControllers(options =>
{
    // 注册全局操作过滤器
    options.Filters.Add<ExecutionTimeFilter>();
    // 注册全局异常过滤器
    options.Filters.Add<CustomExceptionFilter>();
});

var app = builder.Build();

app.MapControllers();

app.Run();

2. 控制器级别注册

将过滤器作为特性标注在控制器类上,该过滤器会对控制器下的所有操作生效。

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
[ExecutionTimeFilter] // 控制器级别注册,对该控制器下所有操作生效
public class UserController : ControllerBase
{
    [HttpGet]
    public IActionResult GetUsers()
    {
        return Ok(new[] { "用户1", "用户2" });
    }
}

3. 操作级别注册

将过滤器作为特性标注在具体的操作方法上,该过滤器只会对当前操作生效。

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
    [HttpGet]
    [ExecutionTimeFilter] // 操作级别注册,仅对当前GetOrder操作生效
    public IActionResult GetOrder(int id)
    {
        return Ok(new { OrderId = id, OrderName = "测试订单" });
    }

    [HttpPost]
    public IActionResult CreateOrder()
    {
        return Ok();
    }
}

过滤器和中间件的区别

很多开发者会混淆过滤器和中间件,两者的核心区别如下:

对比项过滤器中间件
执行范围仅作用于MVC/API的请求处理流程作用于整个应用的请求处理管道
可访问的上下文可以访问控制器、操作方法、参数、模型状态等MVC相关信息只能访问HttpContext,无法获取MVC相关的上下文信息
适用场景处理MVC相关的横切逻辑,如操作参数验证、操作级别的授权、操作结果处理等处理通用的请求逻辑,如跨域处理、静态文件服务、通用请求日志等
注册方式全局注册、控制器级别、操作级别在请求管道中按顺序注册

使用注意事项

  • 过滤器的执行顺序可以通过实现IOrderedFilter接口或者设置Order属性来调整,Order值越小越先执行。
  • 不要在过滤器中做过于耗时的操作,避免阻塞请求处理流程,如果有耗时操作可以考虑异步处理。
  • 异常过滤器中如果已经处理了异常,记得设置ExceptionHandled为true,避免异常继续向上抛出被其他组件处理。
  • 如果过滤器需要依赖其他服务,可以通过构造函数注入的方式获取,框架会自动进行依赖注入。

通过合理使用过滤器,可以把通用逻辑从业务代码中抽离出来,让控制器和操作方法的代码更简洁,也便于统一维护通用逻辑。开发者可以根据实际需求选择合适的过滤器类型和注册方式,提升开发效率。

ASP.NET_Core过滤器Filter中间件修改时间:2026-06-21 15:00:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。