一、核心区别
-
日志中间件(Middleware) 管 所有请求 :静态文件、404、Swagger、控制器、路由错误...... 全都能拦到。→ 范围最大
-
ActionFilter / IAsyncActionFilter 只管 进入控制器 Action 的请求, 404、路由失败、授权失败都拦不到。→ 范围小、粒度更细
二、详细对比(面试常问)
1. 执行时机不同
- 中间件:最早执行,在 MVC 管道之前
- ActionFilter:在模型绑定后、Action 执行前
2. 覆盖范围不同
- 中间件:全量请求
- Filter:只针对 Controller/Action
3. 能拿到的信息不同
- 中间件:只能拿到 HttpContext,拿不到 Action 参数、方法名
- ActionFilter:能拿到 Action 参数、控制器名、方法名、模型验证状态
4. 异常覆盖不同
- 中间件:能捕获整个管道所有异常
- ActionFilter:只能捕获 Action 内异常
三、现在应该怎么选?(实战建议)
方案 A:只使用 日志中间件(最简单、最稳、企业最常用)
后台管理系统 / API 项目 统一用:日志中间件 + Serilog
优点:
- 一次编写,覆盖所有请求
- 不会漏
- 代码简单
- 配合 Serilog 完美
方案 B:只使用 ActionFilter
只有这些场景才用 ActionFilter
- 单独给某个接口做日志
- 要打印方法参数、返回值
- 做权限校验、限流、参数校验
优点:
- 可以精细控制某个控制器 / Action 单独打日志
- 能拿到参数、方法名
缺点:
- 404 不进过滤器
- 容易漏日志
方案 C:两个都写?
绝对不要! 会导致一条请求打印两条日志,冗余、混乱、排查问题麻烦。
五、最精简总结(背住)
- 日志中间件 = 全局请求日志(推荐)
- ActionFilter = 控制器级别的 AOP(不适合做全局请求日志)
- 效果一样,但范围不一样
- 企业项目二选一,不要都用