【过滤器】一文了解 .NET Core 中各种 Filter

在ASP.NET Core中,Filter(过滤器)是一种强大的机制,允许你在请求处理管道中的特定阶段运行代码。这些过滤器提供了在请求的不同阶段执行逻辑的能力,比如授权、日志记录、异常处理等。ASP.NET Core 提供了多种类型的过滤器,每种类型都在请求处理管道的不同阶段运行。

🔥以下是ASP.NET Core中主要的过滤器类型:

01.授权过滤器(Authorization Filters)

🔸在其他过滤器之前执行。

🔸用于确定用户是否被授权访问请求的资源。

🔸 实现IAuthorizationFilter接口。

复制代码
public class MyAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // 检查用户是否授权
        // 如果未授权,可以设置 context.Result 来停止请求处理
    }
}

// 应用到控制器或动作方法
[ServiceFilter(typeof(MyAuthorizationFilter))]
public class MyController : ControllerBase
{
    // ...
}

02.资源过滤器(Resource Filters)

🔸在模型绑定之后和动作过滤器之前执行。

🔸用于处理需要在模型绑定后但动作执行前运行的代码(如缓存)。

🔸 实现IResourceFilter接口。

🔸 也可以实现IAsyncResourceFilter接口以支持异步操作。

复制代码
public class MyAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // 检查用户是否授权
        // 如果未授权,可以设置 context.Result 来停止请求处理
    }
}

// 应用到控制器或动作方法
[ServiceFilter(typeof(MyAuthorizationFilter))]
public class MyController : ControllerBase
{
    // ...
}

03.动作过滤器(Action Filters)

🔸在模型绑定和授权之后,但在视图结果执行之前运行。

🔸用于查看或修改传入的动作参数、调用的动作本身或动作结果。

🔸 实现IActionFilter接口。

🔸 也可以实现IAsyncActionFilter接口以支持异步操作。

复制代码
public class MyActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 在动作执行之前运行
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 在动作执行之后,结果执行之前运行
    }
}

// 或者使用特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : Attribute, IActionFilter
{
    // ... 实现与上面相同
}

// 应用到控制器或动作方法
[MyActionFilter]
public class MyController : ControllerBase
{
    // ...
}

04.异常过滤器(Exception Filters)

🔸当动作执行后发生未处理的异常时运行。

🔸用于处理未处理的异常,并提供一个替代的HTTP响应。

🔸实现IExceptionFilter接口。

复制代码
public class MyExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        // 处理异常
        // 可以设置 context.Result 来提供替代的HTTP响应
    }
}

// 应用到控制器或动作方法
[ServiceFilter(typeof(MyExceptionFilter))]
public class MyController : ControllerBase
{
    // ...
}

05.结果过滤器(Result Filters)

🔸在动作结果执行之后运行。

🔸 用于查看或修改由动作方法返回的IActionResult。

🔸 实现IResultFilter接口。

🔸 也可以实现IAsyncResultFilter接口以支持异步操作。

复制代码
public class MyResultFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext context)
    {
        // 在结果执行之前运行
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {
        // 在结果执行之后运行
    }
}

// 应用到控制器或动作方法
[ServiceFilter(typeof(MyResultFilter))]
public class MyController : ControllerBase
{
    // ...
}

06.全局异常处理器(Global Exception Handler)

🔸这并不是一个过滤器,但它是ASP.NET Core中处理全局异常的一种机制。

🔸 通过配置UseExceptionHandler中间件来处理全局未处理的异常。

🔸 中间件(Middleware)

虽然不是过滤器,但中间件是ASP.NET Core中处理请求和响应的另一种机制。

中间件在请求处理管道中运行,并可以决定是否将请求传递给管道中的下一个组件,或者是否直接发送响应给客户端。

复制代码
public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            // 处理异常并返回适当的响应
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        // 写入响应体或其他错误处理逻辑
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        context.Response.ContentType = "text/plain";

        return context.Response.WriteAsync("Internal Server Error");
    }
}

// 在Startup.cs中配置中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...
    app.UseMiddleware<ErrorHandlingMiddleware>();
    // ...
}

使用过滤器时,你可以通过特性(Attribute)将其直接应用于控制器或动作方法,或者通过全局配置将其应用于整个应用程序。这些过滤器提供了一种灵活且模块化的方式来扩展ASP.NET Core应用程序的功能。

请注意,对于使用ServiceFilter的过滤器,你需要在Startup.cs中的ConfigureServices方法中注册它们作为服务。例如:

复制代码
public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddScoped<MyAuthorizationFilter>();
    services.AddScoped<MyResourceFilter>();
    services.AddScoped<MyExceptionFilter>();
    // ...
}

而使用特性(Attribute)的过滤器则不需要在ConfigureServices中注册

相关推荐
棉晗榜15 天前
C# .net core添加单元测试项目,依赖注入接口测试
单元测试·c#·.netcore
时光追逐者16 天前
.NET初级软件工程师面试经验分享
经验分享·面试·职场和发展·c#·.net·.netcore
忧郁的蛋~17 天前
.NET Core 实现缓存的预热的方式
缓存·c#·.net·.netcore
csdn_aspnet18 天前
C# .NET Core 源代码生成器(dotnet source generators)
c#·.netcore
时光追逐者18 天前
C#/.NET/.NET Core技术前沿周刊 | 第 42 期(2025年6.9-6.15)
c#·.net·.netcore
csdn_aspnet19 天前
使用 C# 源生成器(Source Generators)进行高效开发:增强 Blazor 及其他功能
c#·.netcore
lgaof65822@gmail.com21 天前
Asp.Net Core SignalR导入数据
前端·后端·asp.net·.netcore
眸笑丶21 天前
.NET Core 数据库连接字符串加密与解密
数据库·oracle·.netcore
时光追逐者24 天前
C#/.NET/.NET Core技术前沿周刊 | 第 41 期(2025年6.1-6.8)
c#·.net·.netcore
lgaof65822@gmail.com1 个月前
ASP.NET Core SignalR - 部分客户端消息发送
后端·asp.net·.netcore