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

深入理解ASP.NET Core结果过滤器(ResultFilter)

在开发ASP.NET Core Web应用时,我们常常需要在控制器返回结果前后执行一些通用逻辑,比如日志记录、性能监控、统一格式包装等。这时,结果过滤器(ResultFilter)就派上了用场!本文将带你从基础概念到实际编码,一步步掌握ASP.NET Core结果过滤器的使用方法,即使你是编程小白也能轻松上手。

深入理解ASP.NET Core结果过滤器(ResultFilter) ASP.NET Core结果过滤器 ResultFilter教程 C#结果过滤器 Core中间件 第1张

什么是ResultFilter?

ResultFilter是ASP.NET Core中四种过滤器之一(其他包括ActionFilter、AuthorizationFilter、ExceptionFilter),它专门用于在ActionResult执行之前和之后插入自定义逻辑。

举个例子:你希望所有API返回的数据都自动包裹在一个统一的响应结构中(如包含code、message、data字段),而不需要在每个Action里重复写包装代码——这正是ResultFilter的用武之地。

如何创建一个ResultFilter?

在C#中,你可以通过实现IResultFilterIAsyncResultFilter接口来创建自己的结果过滤器。下面是一个同步ResultFilter的简单示例:

using Microsoft.AspNetCore.Mvc.Filters;using Microsoft.AspNetCore.Mvc;using System.Text.Json;public class WrapResultFilter : IResultFilter{    public void OnResultExecuting(ResultExecutingContext context)    {        // 在ActionResult执行前触发        // 通常用于修改Result或记录日志    }    public void OnResultExecuted(ResultExecutedContext context)    {        // 在ActionResult执行后触发        // 可用于清理资源或记录执行时间    }}

实战:统一API响应格式

下面我们实现一个实用的ResultFilter,将所有JSON结果自动包装成如下格式:

{  "code": 200,  "message": "success",  "data": { /* 原始返回内容 */ }}

实现代码如下:

using Microsoft.AspNetCore.Mvc.Filters;using Microsoft.AspNetCore.Mvc;using System.Text.Json;public class UnifiedResultFilter : IResultFilter{    public void OnResultExecuting(ResultExecutingContext context)    {        // 我们只处理ObjectResult(即return Ok(data)这类)        if (context.Result is ObjectResult objectResult)        {            var originalData = objectResult.Value;            var wrappedData = new            {                code = objectResult.StatusCode ?? 200,                message = "success",                data = originalData            };            // 替换原Result为新的包装结果            context.Result = new JsonResult(wrappedData)            {                StatusCode = objectResult.StatusCode            };        }    }    public void OnResultExecuted(ResultExecutedContext context)    {        // 此处可留空,或添加日志    }}

注册ResultFilter

创建好过滤器后,需要在Program.cs(.NET 6+)中注册它:

var builder = WebApplication.CreateBuilder(args);// 添加服务builder.Services.AddControllers(options =>{    options.Filters.Add<UnifiedResultFilter>(); // 全局注册});var app = builder.Build();app.MapControllers();app.Run();

这样,所有控制器的返回结果都会被自动包装!当然,你也可以通过[TypeFilter(typeof(UnifiedResultFilter))]特性在特定Controller或Action上应用该过滤器。

ResultFilter与其他过滤器的区别

为了更好地理解ASP.NET Core结果过滤器,我们简要对比一下四种过滤器的执行顺序:

  1. AuthorizationFilter:最先执行,用于身份验证和授权。
  2. ActionFilter:在Action执行前后运行,可修改参数或结果。
  3. ResultFilter:在ActionResult执行前后运行,专注于结果处理。
  4. ExceptionFilter:仅在发生未处理异常时触发。

因此,如果你的需求是“处理最终返回给客户端的数据”,那么C#结果过滤器是最合适的选择。

总结

通过本文,你已经学会了如何在ASP.NET Core中使用ResultFilter来统一处理API响应、记录日志或进行性能监控。这种机制不仅减少了重复代码,还提高了项目的可维护性。

记住,ASP.NET Core中间件虽然也能处理请求/响应管道,但ResultFilter更贴近MVC层,能直接访问ActionResult对象,更适合业务逻辑相关的结果处理。

赶快动手试试吧!你的下一个项目一定会因为使用了ResultFilter而更加优雅高效。