一、中间件是什么
.NET Core 中间件是构成 HTTP 请求处理管道的核心组件,用于接收、处理 HTTP 请求并生成响应。每个中间件都具备特定职责,可自主决定是否将请求传递给下一个中间件,也能在请求处理前后执行自定义逻辑,遵循 "请求入栈、响应出栈" 的洋葱模型。其核心价值在于实现关注点分离,让日志记录、身份验证、跨域处理等功能独立封装,支持灵活组合与插拔,大幅提升系统扩展性与可维护性。
二、中间件的核心使用方式
1. 基础注册与执行逻辑
中间件通过 IApplicationBuilder 接口链式注册,app.UseXXX 方法的调用顺序即为请求处理顺序(响应时反向执行)。核心调用逻辑通过 next() 方法控制:调用 next() 则将请求传递给下一个中间件,不调用则触发短路机制,直接返回响应。
2. 核心使用方法详解
(1)app.Run:管道终点
- 特性:无
next参数,强制短路,始终作为管道最后一个中间件。 - 使用场景:默认 404 响应、健康检查端点、简单固定响应返回。
- 示例:
csharp
app.Run(async context =>
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
await context.Response.WriteAsync("资源未找到");
});
(2)app.Use:通用中间件
- 特性:接收
next参数,可灵活控制是否短路,支持请求前预处理与响应后处理。 - 使用场景:日志记录、性能监控、请求头修改、异常捕获等通用场景。
- 示例:
csharp
app.Use(async (context, next) =>
{
// 请求处理前:记录请求信息
var requestTime = DateTime.UtcNow;
// 传递给下一个中间件
await next();
// 响应处理后:记录耗时
var elapsed = DateTime.UtcNow - requestTime;
Console.WriteLine($"请求 {context.Request.Path} 耗时:{elapsed.TotalMilliseconds}ms");
});
(3)app.UseWhen:条件执行中间件
- 特性:基于自定义条件触发分支中间件,执行后返回主管道继续处理。
- 使用场景:特定路径(如
/api)、特定请求头、特定客户端的差异化处理。 - 示例:
csharp
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), apiApp =>
{
// 仅/api路径请求执行:添加API版本头
apiApp.Use(async (context, next) =>
{
context.Response.Headers.Add("X-API-Version", "2.0");
await next();
});
});
(4)app.Map:路径分支中间件
- 特性:基于路径创建独立管道,分支内处理完毕后不返回主管道。
- 使用场景:管理员专区、静态文件服务、微服务风格 API 分组。
- 示例:
csharp
app.Map("/admin", adminApp =>
{
// 独立管道:启用认证授权
adminApp.UseAuthentication();
adminApp.UseAuthorization();
adminApp.Run(async context =>
{
await context.Response.WriteAsync("管理员专区");
});
});
(5)app.UseMiddleware:类中间件
- 特性:封装为独立类,支持依赖注入,适用于复杂逻辑与复用场景。
- 实现方式:可继承
IMiddleware接口,或基于约定实现InvokeAsync方法。 - 使用场景:团队共享组件、复杂业务逻辑处理(如数据加密、权限校验)。
- 示例:
csharp
// 自定义类中间件
public class EncryptionMiddleware
{
private readonly RequestDelegate _next;
public EncryptionMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext context)
{
// 加密相关处理
await _next(context);
}
}
// 注册使用
app.UseMiddleware<EncryptionMiddleware>();
三、常用内置中间件实战场景
1. 安全类中间件
- UseAuthentication :身份验证,验证用户身份(如 JWT、Cookie 认证),需搭配
AddAuthentication服务配置。 - UseAuthorization:授权校验,基于角色、策略判断用户是否有权访问资源。
- UseCors:跨域处理,配置允许的来源、方法、请求头,解决前端跨域问题。
2. 性能优化类中间件
- UseResponseCompression:响应压缩,压缩 HTTP 响应体(如 Gzip、Brotli),减少传输体积。
- UseOutputCache:输出缓存(.NET 7+),缓存响应结果,提升重复请求处理速度。
3. 诊断与监控类中间件
- UseExceptionHandler:异常处理,捕获管道中未处理的异常,返回友好错误信息。
- MapHealthChecks :健康检查,提供应用状态端点(如
/health),适配监控系统。
4. 基础功能类中间件
- UseHttpsRedirection:HTTPS 重定向,将 HTTP 请求强制转为 HTTPS,提升传输安全性。
- UseStaticFiles:静态文件服务,提供 CSS、JS、图片等静态资源访问支持。
四、使用注意事项
- 注册顺序敏感:核心中间件需按 "异常处理→HTTPS 重定向→静态文件→路由→认证授权→终结点" 的顺序注册,避免功能失效。
- 谨慎使用短路:短路中间件(如认证失败)需明确业务场景,避免正常请求被意外拦截。
- 类中间件复用:复杂逻辑优先封装为类中间件,通过依赖注入解耦,提升代码可维护性。
- 环境差异化配置:开发环境可启用 Swagger、详细异常页,生产环境启用 HTTPS、响应压缩等优化。
中间件作为.NET Core 的核心设计,通过灵活组合与插拔,让开发者能快速构建高可用、易扩展的 Web 应用。合理选择与配置中间件,既能满足业务需求,又能保障系统性能与安全性。