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

devtools/2024/11/26 6:34:09/

在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中注册


http://www.ppmy.cn/devtools/137045.html

相关文章

函数模板(进阶)

机甲为婚纱&#xff0c;银河为殿堂&#xff0c;爆炸为礼炮&#xff0c;见证了只属于他们的婚礼&#xff0c;樱花树下&#xff0c;再续前缘&#xff0c;鹤望兰无凋零之时&#xff0c;比翼鸟永世长存。 我们这一篇博客紧接我们前面的函数模板&#xff08;初阶&#xff09;这一篇博…

《Vue零基础教程》模板和基础语法讲解(4)

1 模板 1) 什么是模板 什么是模板 由Vue解析的HTML字符串 Vue的主要工作 编译模板挂载 2) 如何确定模板 确定模板有几种方式 没有指定template选项, 以容器的innerHTML做为模板指定template选项, 以template选项做为模板指定render选项, 以render函数做为模板 优先级: r…

clickhouse 分片键的重要性

文章目录 背景反思为啥出现问题为啥默认的语义是local 背景 问题背景 详细内容可以看这个 反思为啥出现问题 为啥会出现链接里出现的问题&#xff0c;对于goal join 和 join 语义不一样的问题&#xff0c;那是因为分片键设计不合理的情况 如果表a和表b 都是user_id 作分片键…

通过shell脚本分析部署nginx网络服务

1.接收用户部署的服务名称 read -p "请输入要部署的服务器名称&#xff1a;" service_name 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包…

蓝桥杯每日真题 - 第23天

题目&#xff1a;&#xff08;直线&#xff09; 题目描述&#xff08;12届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目理解: 在平面直角坐标系中&#xff0c;从给定的点集中确定唯一的直线。 两点确定一条直线&#xff0c;判断两条直线是否相同&#xff0c;可通过…

Java 基于SpringBoot +Vue的4S 店车辆管理系统(附源码,说明文档,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

CTF之密码学(键盘加密)

在CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;中&#xff0c;键盘加密是一种独特而有趣的加密方式&#xff0c;它巧妙地利用了键盘的布局和坐标进行信息的加密和解密。以下是关于CTF中键盘加密的详细解释&#xff1a; 一、键盘加密的定义 键盘加密是通过…