ZetCode

ASP.NET ResultFilter

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 ResultFilter。Result filters 允许您在 ASP.NET Core 中执行操作结果之前或之后运行代码。

ASP.NET filters 提供了一种在请求处理管道的特定阶段运行代码的方法。Result filters 对于修改响应或添加标头特别有用。

基本定义

ASP.NET Core 中的 ResultFilter 是一种操作过滤器,它在操作结果执行之前或之后运行代码。它实现了 IResultFilter 或 IAsyncResultFilter 接口。

Result filters 在操作方法完成后但在结果处理之前执行。它们可以修改响应或短路执行。

常见用例包括响应格式化、添加标头、日志记录或修改响应内容。Result filters 对成功和失败的操作结果都会运行。

ASP.NET ResultFilter 示例

以下示例演示了在 ASP.NET 8 中创建和使用自定义 ResultFilter 来添加响应标头。

Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.Filters.Add<AddCustomHeadersFilter>();
});

var app = builder.Build();

app.MapControllers();
app.Run();

这将配置应用程序全局使用我们的自定义 ResultFilter。该过滤器将应用于所有控制器操作。

Filters/AddCustomHeadersFilter.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class AddCustomHeadersFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext context)
    {
        // Runs before the action result executes
        if (context.HttpContext.Response.Headers.ContainsKey("X-Custom-Header"))
        {
            context.HttpContext.Response.Headers.Remove("X-Custom-Header");
        }
        
        context.HttpContext.Response.Headers.Add(
            "X-Custom-Header", "Custom-Value");
            
        context.HttpContext.Response.Headers.Add(
            "X-Response-Time", DateTime.UtcNow.ToString());
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {
        // Runs after the action result executes
        // Can be used for cleanup or logging
    }
}

此过滤器会为每个响应添加两个自定义标头。OnResultExecuting 方法在结果执行之前运行,而 OnResultExecuted 在结果执行之后运行。

Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new { Name = "Product 1", Price = 19.99 });
    }
}

当您调用 /api/products 端点时,响应将包含我们过滤器添加的自定义标头。这演示了 ResultFilters 如何修改响应。

该示例显示了一个全局过滤器,但您也可以使用 [ServiceFilter][TypeFilter] 属性将 ResultFilters 应用于特定控制器或操作。

来源

Microsoft ASP.NET Filters 文档

在本文中,我们探讨了 ASP.NET 8 中的 ResultFilter。此强大功能允许您拦截和修改 Web 应用程序中的响应。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 ASP.NET 教程