核心概念先明确
在看流程前,需先区分两者的核心差异,避免混淆:
| 维度 | 中间件(Middleware) | 过滤器(Filter) |
|---|---|---|
| 作用层级 | 全局请求管道(HTTP 生命周期) | 控制器/动作方法层级(MVC 框架内部) |
| 处理时机 | 早于过滤器(请求进入管道即触发) | 晚于中间件(路由匹配后、控制器执行前后触发) |
| 核心职责 | 处理 HTTP 上下文(如日志、认证、静态文件) | 处理 MVC 上下文(如权限校验、模型验证、异常) |
| 依赖框架 | 依赖 ASP.NET Core 基础管道,与 MVC 无关 | 依赖 MVC/Razor Pages 框架 |

关键节点拆解(避免踩坑)
-
中间件的“双向性”
中间件按“正向顺序执行(请求阶段)→ 反向顺序执行(响应阶段)”,例如:
日志中间件(正向)→ 认证中间件(正向)→ 路由中间件(正向)→ 控制器执行 → 路由中间件(反向)→ 认证中间件(反向)→ 日志中间件(反向)
若某中间件未调用await _next(context)(未传递请求给下一个中间件),则管道会“短路”,直接进入反向流程。 -
过滤器的“层级优先级”
过滤器支持 全局、控制器、动作方法 三个层级,执行顺序为:
全局过滤器 → 控制器过滤器 → 动作方法过滤器(如全局授权过滤器先于控制器授权过滤器执行)。 -
异常处理的“覆盖关系”
- 过滤器异常(如授权失败、模型验证失败):优先由 异常过滤器 处理,处理后直接返回响应,不进入后续中间件的“正向流程”。
- 中间件异常(如认证失败、静态文件不存在):由 异常处理中间件(如
UseExceptionHandler)处理,早于过滤器触发。
