Day15-4:【日志】中间件和过滤器 的对比选择

一、核心区别

  1. 日志中间件(Middleware) 管 所有请求 :静态文件、404、Swagger、控制器、路由错误...... 全都能拦到。→ 范围最大

  2. 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(不适合做全局请求日志)
  • 效果一样,但范围不一样
  • 企业项目二选一,不要都用
相关推荐
1-1=01 天前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
1-1=04 天前
C# IO和序列化
c#·.net·.netcore
宝桥南山5 天前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
1-1=06 天前
C# 特性(Attribute)
c#·.net·.netcore
淡海水7 天前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
1-1=07 天前
C# 反射
c#·.net·.netcore
1-1=08 天前
C# 泛型
c#·.net·.netcore
淡海水10 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
1-1=010 天前
.NET Core 编译技术
.net·.netcore
1-1=011 天前
.NET Core 文件系统
.net·.netcore·1024程序员节