中间件是ASP.NET Core中处理HTTP请求和响应的组件,按注册顺序组成管道,可执行前置逻辑、短路请求或后置处理。推荐通过类定义中间件,包含构造函数和InvokeAsync方法,并在Program.cs中用UseMiddleware注册;也可使用app.Use内联定义。执行顺序由注册顺序决定,如异常处理应置于前端以捕获后续异常,静态文件中间件若位于认证前则资源可匿名访问,合理设计中间件顺序有助于构建高效可维护的应用。

中间件(Middleware)是 ASP.NET Core 中用于处理 HTTP 请求和响应的组件。它按顺序组成一个请求管道,每个中间件可以决定是否将请求传递给下一个组件,也可以在请求前或响应后执行逻辑,比如身份验证、日志记录、异常处理等。
中间件的工作机制
请求进入应用后,会依次经过注册的中间件。每个中间件都有机会:
- 在下一个中间件之前处理请求
- 选择是否调用下一个中间件(不调用则短路管道)
- 在响应返回时进行后续处理
中间件通过 Use、Run 或 Map 方法注册到管道中,顺序非常重要,因为执行顺序就是注册顺序。
如何自定义中间件
在 ASP.NET Core 中创建自定义中间件有推荐方式和传统方式两种,推荐使用基于类的方式,结构更清晰。
方式一:基于类的中间件(推荐)
创建一个类,包含一个构造函数和一个名为 Invoke 或 InvokeAsync 的方法:
public class CustomHeaderMiddleware{
private readonly RequestDelegate _next;
public CustomHeaderMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 在请求前添加自定义响应头
context.Response.Headers["X-Custom-Header"] = "MyCustomValue";
// 调用管道中的下一个中间件
await _next(context);
// 可选:在响应返回后做些事情
// 例如记录状态码
Console.WriteLine($"Response status: {context.Response.StatusCode}");
}
}
然后在 Program.cs 中注册该中间件:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
app.UseMiddleware
app.MapGet("/", () => "Hello World!");
app.Run();
方式二:使用 Use 扩展方法(内联写法)
适合简单逻辑,直接在 Program.cs 中使用 app.Use:
app.Use(async (context, next) =>{
context.Response.Headers["X-Simple-Header"] = "InlineValue";
await next(); // 继续执行下一个中间件
});
app.MapGet("/", () => "Hello from inline middleware!");
中间件的执行顺序注意事项
中间件的注册顺序直接影响行为。例如:
- 异常处理中间件通常放在最前面(以便捕获后续所有异常)
- 路由中间件要在使用路由功能的组件之前
- 静态文件中间件如果放在认证之前,则静态资源无需认证即可访问
基本上就这些。自定义中间件是扩展 ASP.NET Core 功能的核心手段之一,理解其机制有助于构建高效、可维护的应用程序。










