【过滤器】一文了解 .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中注册

相关推荐
lixww.cn1 天前
ASP.NET Core与配置系统的集成
.netcore
张3蜂3 天前
如何利用Docker和.NET Core实现环境一致性、简化依赖管理、快速部署与扩展,同时提高资源利用率、确保安全性和生态系统支持
docker·容器·.netcore
lixww.cn4 天前
.NET Core 中依赖注入的使用
.netcore
醉の虾4 天前
Vue3 结合 .NetCore WebApi 前后端分离跨域请求简易实例
前端·vue.js·.netcore
时光追逐者4 天前
一组开源、免费、Metro风格的 WPF UI 控件库
ui·开源·c#·.net·wpf·.netcore·微软技术
时光追逐者6 天前
C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
microsoft·c#·.net·.netcore·微软技术
lixww.cn6 天前
.NET Core缓存
缓存·.netcore
lixww.cn7 天前
ASP.NET Core MVC
c#·mvc·.netcore
亦世凡华、7 天前
从CRUD到高级功能:EF Core在.NET Core中全面应用(四)
经验分享·.netcore·ef core·表达式树
lixww.cn7 天前
ASP.NET Core WebAPI的异步及返回值
.netcore