Asp.net Core Filter执行顺序

1.过滤器类型

ASP.NET Core 有以下五种类型的过滤器,每个过滤器类型在过滤器管道中的不同阶段执行:

1.Authorization Filter
授权过滤器 在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个Before方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。

2.Resource Filter
资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。

3.Action Filter
使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行。

4.Exception Filter
用于为应用程序执行异常处理策略。

5.Result Filter
当 Action 执行完成后,最后会执行过滤器。用于处理ActionResult结果输出策略。

在这里插入图片描述

2.默认执行顺序

当管道的某个阶段存在多个过滤器时,过滤器执行的默认顺序由作用域确定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action方法过滤器。

以下示例是同步 Action 过滤器调用的顺序:

	过滤器作用域		过滤器方法
1	Global			OnActionExecuting
2	Controller		OnActionExecuting
3	Method			OnActionExecuting
4	Method			OnActionExecuted
5	Controller		OnActionExecuted
6	Global			OnActionExecuted

提示
每个控制器的基类Controller包含OnActionExecuting和OnActionExecuted方法。其中OnActionExecuting在所有过滤器之前调用,OnActionExecuted在所有过滤器之后调用。

3.覆盖默认执行顺序

您可以通过实现IOrderedFilter接口来覆盖默认的执行顺序。此接口公开了Order属性表示优先级,以确定执行顺序;具有较低Order值的过滤器将在具有较高Order值的过滤器之前执行前置方法;具有较低Order值的过滤器将在具有较高Order值的过滤器之后执行后置方法。

您可以使用构造函数参数设置Order属性:
[MyFilter(Name = "Controller Level Attribute", Order=1)]
 	过滤器作用域		Order	过滤器方法
1	Method			1		OnActionExecuting
2	Controller		2		OnActionExecuting
3	Global			3		OnActionExecuting
4	Global			3		OnActionExecuted
5	Controller		2		OnActionExecuted
6	Method			1		OnActionExecuted

过滤器执行时,Order属性的优先级高于作用域。过滤器首先按Order属性排序,然后再按作用域排序。所有内置过滤器实现IOrderedFilter接口并将Order值默认设置为0;因此,除非设置Order属性为非零值,否则按作用域的优先级执行。

在这里插入图片描述

### ASP.NET CoreFilter 的注册方法 在 ASP.NET Core 应用程序中,可以通过多种方式注册过滤器。这些方式包括全局注册、控制器级别注册和动作级别的注册。 #### 全局注册 为了使过滤器适用于应用程序中的所有端点,可以在 `Program.cs` 文件中进行全局注册。此操作通常是在服务配置阶段完成的。对于 Action 过滤器而言,代码如下所示: ```csharp builder.Services.AddControllers(options => { options.Filters.Add<GlobalLogActionFilter>(); }); ``` 这段代码将 `GlobalLogActionFilter` 添加到了所有的控制器和动作上[^2]。 #### 控制器级别注册 如果希望某个过滤器仅作用于特定的控制器,则可以直接在目标控制器类中标记 `[TypeFilter(typeof(CustomControllerFilter))]` 或者更简单的 `[CustomControllerFilter]` 属性标签。这种方式使得指定的过滤器只影响带有标记属性的那个控制器内的所有动作方法。 #### 动作级别注册 当只需要针对个别具体的方法实施过滤逻辑时,在相应的方法声明上方添加类似的特性装饰即可实现这一点。例如: ```csharp [TypeFilter(typeof(ActionLevelLogging))] public IActionResult Index() { return View(); } ``` 这里定义了一个名为 `Index` 的动作,并为其指定了一个叫做 `ActionLevelLogging` 的过滤器实例[^1]。 #### 自定义过滤器类型 除了内置的支持外,还可以创建自己的过滤器类继承自抽象基类如 `IAsyncActionFilter`, `IAuthorizationFilter`, `IExceptionFilter` 等等。通过重写其中的方法来自定义行为,比如拦截请求前后的处理或是修改最终响应的内容。 关于如何管理过滤器的生命周期以及控制其执行顺序方面,可以利用依赖注入容器来解决这个问题。另外值得注意的是,在 ASP.NET Core MVC 架构下,虽然仍然保留了传统的过滤器概念用于增强某些功能模块的功能,但在整体架构设计上更加倾向于使用中间件作为构建 HTTP 请求/响应管道的主要手段[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值