一、请求处理管道(Pipeline)
1. 是什么?
ASP.NET Core 处理 HTTP 请求的一条流水线。 请求进来 → 依次经过多个中间件 → 响应返回。
2. 核心特点
- 单向进入,双向返回 请求:从上到下执行中间件 响应:从下到上原路返回
- 顺序至关重要 先注册的中间件先执行
- 可短 – circuit(短路) 某个中间件直接返回响应,后面的中间件不再执行
3. 形象比喻
管道 = 医院看病流程 挂号 → 分诊 → 看病 → 缴费 → 拿药 请求必须按顺序走完全程。
二、中间件(Middleware)
1. 是什么?
管道里的每一个处理环节,是一个可以处理请求 / 响应的独立组件。
2. 两种写法
① 内联中间件
app.Use(async (context, next) =>
{
// 请求进来
Console.WriteLine("请求处理前");
// 调用下一个中间件
await next();
// 响应返回
Console.WriteLine("响应处理后");
});
② 自定义中间件类
public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 逻辑
await _next(context);
}
}
3. 常用中间件(静态文件 → CORS → 路由 → 认证 → 授权 → 控制器)
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting(); // 路由
app.UseCors(); // 跨域
app.UseAuthentication(); // 认证
app.UseAuthorization(); // 授权
app.MapControllers();
4. 三个核心方法区别
Use:可以执行 next,也可以不执行(最常用)Run:短路,不调用 next,请求到此结束Map:按路径分支,如 /admin 走一套中间件
三、配置系统(Configuration)
1. 是什么?
ASP.NET Core 读取配置的统一系统,支持多数据源、热重载、强类型绑定。
2. 默认加载顺序(后面覆盖前面)
- appsettings.json
- appsettings.{Environment}.json
- 用户机密(开发环境)
- 环境变量
- 命令行参数
3. 读取配置的三种方式
① 直接读
var connStr = builder.Configuration["ConnectionStrings:Default"];
② 绑定到强类型类(最佳实践)
builder.Configuration.GetSection("Jwt").Bind<JwtOptions>();
③ 注入 IOptions<T>
public class Service(IOptions<JwtOptions> options)
{
}
4. 三种 IOptions 区别
IOptions<T>:单例,不热更新IOptionsSnapshot<T>:作用域,每个请求重新加载IOptionsMonitor<T>:单例,实时热更新
四、依赖注入(DI)与 生命周期
1. 是什么?
框架自动帮你创建对象、管理对象生命周期、注入依赖。
2. 三大生命周期(面试必考)
① Singleton(单例)
- 整个应用只创建一个实例
- 线程不安全
- 适合:无状态、工具类、配置、日志
builder.Services.AddSingleton<IMyService, MyService>();
② Scoped(作用域)
- 每个请求创建一个实例
- 请求结束销毁
- 最常用:EF Core DbContext、业务服务
builder.Services.AddScoped<IMyService, MyService>();
③ Transient(瞬时)
- 每次使用都创建新实例
- 最轻量
- 适合:无状态、轻量级服务
builder.Services.AddTransient<IMyService, MyService>();
3. 生命周期禁止 “降级”(黄金规则)
长生命周期服务 不能 依赖 短生命周期服务 错误:
- Singleton → Scoped
- Singleton → Transient
正确:
- Scoped → Singleton
- Transient → Scoped / Singleton
4. 注入方式
- 构造函数注入(官方推荐)
- 方法注入
- 属性注入(.NET 8+ 支持)
一张表
| 概念 | 核心作用 | 关键点 |
|---|---|---|
| 管道 | 请求处理流程 | 顺序执行、双向往返、可短路 |
| 中间件 | 管道中的处理单元 | Use/Run/Map、顺序决定功能 |
| 配置系统 | 读取配置 | 多源覆盖、强类型、热更新 |
| Singleton | 单例 | 全局一个、线程不安全 |
| Scoped | 作用域 | 一个请求一个、DbContext 专用 |
| Transient | 瞬时 | 每次都新实例 |
总结
- 管道是请求的必经之路,中间件是路上的关卡
- 中间件顺序决定功能能否正常运行(认证必须在授权前)
- 配置支持多来源,推荐用强类型 + IOptions
- 生命周期:Scoped 最常用,严禁长生命周期依赖短生命周期
文章摘自:https://www.cnblogs.com/chuansheng/p/19913211
