中间件是.NET Web API中处理HTTP请求的核心组件,按注册顺序在管道中执行,用于实现日志、认证、授权、CORS等功能。通过UseRouting、UseAuthentication、UseAuthorization等内置中间件及自定义中间件(如请求耗时记录),可构建安全高效的请求处理流程,其中执行顺序至关重要,例如UseRouting必须位于UseAuthorization之前,异常处理中间件应置于开头以捕获全局异常。

在 .NET Web API 中,中间件(Middleware)是处理 HTTP 请求和响应的核心机制。它位于客户端与控制器之间,按顺序执行,可用于日志记录、身份验证、异常处理、CORS 配置等通用任务。合理使用中间件能提升应用的可维护性和安全性。
中间件的基本概念
中间件是一段代码,用来在请求管道中处理每个进入的 HTTP 请求或响应。它们按注册顺序依次执行,形成一个“管道”。每个中间件可以选择是否将请求传递给下一个组件。
常见内置中间件包括:
- UseRouting():匹配路由
- UseAuthentication():启用身份验证
- UseAuthorization():执行授权策略
- UseCors():启用跨域资源共享
- UseExceptionHandler():捕获未处理异常
自定义中间件的创建与使用
你可以编写自己的中间件来实现特定逻辑,比如请求日志、性能监控或请求头检查。
步骤如下:
- 创建一个类,包含 Invoke 或 InvokeAsync 方法
- 注入所需服务(如 ILogger)
- 在 Program.cs 中注册该中间件
示例:记录请求耗时的中间件
public class RequestTimeLoggerMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public RequestTimeLoggerMiddleware(RequestDelegate next, ILogger logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var startTime = DateTime.Now;
await _next(context);
var duration = DateTime.Now - startTime;
_logger.LogInformation($"请求 {context.Request.Path} 耗时: {duration.TotalMilliseconds}ms");
}
}
扩展方法封装(推荐做法):
public static class RequestTimeLoggerExtensions
{
public static IApplicationBuilder UseRequestTimeLogger(this IApplicationBuilder app)
{
return app.UseMiddleware();
}
}
在 Program.cs 中配置中间件管道
.NET 6 及以上版本使用 Minimal API 模式,在 Program.cs 中直接配置中间件顺序。
注意:顺序至关重要,例如 UseRouting() 必须在 UseAuthorization() 之前。
示例配置:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build();app.UseExceptionHandler("/error"); // 异常处理 app.UseCors(policy => policy.AllowAnyOrigin().AllowAnyMethod()); // CORS app.UseAuthentication(); // 认证 app.UseAuthorization(); // 授权 app.UseRouting(); // 路由解析
// 使用自定义中间件 app.UseRequestTimeLogger();
app.MapControllers(); // 映射控制器
app.Run();
如果中间件只针对特定路径,可以使用 Map 或 UseWhen:
app.Map("/api", apiApp =>
{
apiApp.UseRequestTimeLogger();
apiApp.MapControllers();
});
中间件执行顺序的关键原则
中间件的注册顺序决定其执行顺序。以下是一些关键规则:
- 异常处理中间件应放在最前面,确保能捕获后续中间件抛出的异常
- UseRouting() 必须在 UseAuthorization() 和 UseAuthentication() 之前
- 静态文件中间件(UseStaticFiles)通常放在靠前位置,避免不必要的处理
- MapControllers() 应放在最后,作为终结点
错误示例(顺序错误):
app.UseAuthorization(); app.UseRouting(); // 错误:应在 UseAuthorization 前调用 UseRouting
正确顺序:
app.UseRouting(); app.UseAuthentication(); app.UseAuthorization();
基本上就这些。只要理解中间件的执行流程和顺序依赖,就能灵活构建高效、安全的 Web API 请求处理管道。










