中间件是 ASP.NET Core 中的一个核心概念,在处理 HTTP 请求和响应方面起着至关重要的作用。如果您刚接触 ASP.NET Core,了解中间件至关重要,因为它构成了 Web 应用程序中请求处理的主干。
在此综合博客中,您将了解:
让我们开始吧!
ASP.NET Core 中的中间件是指组装到应用程序管道中以处理请求和响应的软件组件。每个中间件都会在流经管道时处理 HTTP 请求,并且可以:
这种模块化方法为开发人员在构建 Web 应用程序时提供了很大的灵活性,因为他们可以轻松配置各种组件来处理安全性、日志记录、路由、错误处理等。
中间件特别适用于:
当 HTTP 请求到达服务器时,ASP.NET Core 会通过一系列中间件组件传递请求。每个中间件组件可以:
这称为请求-响应管道。中间件组件可以将控制权传递给下一个组件,也可以通过发送响应来结束管道。
以下是中间件管道的基本图示:
Incoming HTTP Request → Middleware 1 → Middleware 2 → ... → Endpoint
Outgoing HTTP Response ← Middleware N ← Middleware (N-1) ← ... ← Endpoint
Middleware 是一个委托,它接受一个对象并返回一个 .这表示管道中的下一个中间件,允许每个组件处理请求或传递请求。HttpContextTaskRequestDelegate
该对象包含有关当前 HTTP 请求和响应的信息,包括 Header、body、Query Parameters、User Information 等。中间件组件与此上下文交互以操作流。HttpContext
ASP.NET Core 附带了几个用于常见任务的预定义中间件组件。以下是一些最常用的内置中间件:
现在,让我们创建一个自定义中间件来记录传入的请求。这将帮助您了解中间件在后台是如何工作的,以及如何构建自己的组件。
在项目的根目录中,添加一个名为 的新类。RequestLoggingMiddleware
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// Log request information
Console.WriteLine($"Request: {context.Request.Method} {context.Request.Path}");
// Call the next middleware in the pipeline
await _next(context);
// Log response information
Console.WriteLine($"Response: {context.Response.StatusCode}");
}
}
在 中,通过注册自定义中间件来修改中间件管道。Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Use the custom middleware
app.UseMiddleware<RequestLoggingMiddleware>();
// Built-in middleware for routing and controllers
app.UseRouting();
app.MapControllers();
app.Run();
这会在管道中注册 ,因此它现在将记录每个传入请求及其响应。RequestLoggingMiddleware
运行应用程序并使用 Postman、Curl 或 Web 浏览器发出请求。您应该会在控制台中看到请求方法、路径和响应状态的日志。
中间件组件添加到管道中的顺序至关重要,因为它决定了它们处理请求的顺序。在管道中较早添加的中间件在处理传入请求时首先执行,最后在处理传出响应时执行。
下面是一个示例来说明顺序:
app.UseMiddleware<FirstMiddleware>();
app.UseMiddleware<SecondMiddleware>();
app.UseMiddleware<ThirdMiddleware>();
中间件可以使管道短路,这意味着它可以阻止请求进一步沿链向下传递并直接发送响应。例如,如果身份验证中间件检测到无效的令牌,它可能会立即返回响应,而不会将请求传递给后续中间件。401 Unauthorized
下面是一个短路的示例:
public class ShortCircuitingMiddleware
{
private readonly RequestDelegate _next;
public ShortCircuitingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.ContainsKey("MyCustomHeader"))
{
context.Response.StatusCode = 400;
await context.Response.WriteAsync("Bad Request: Missing MyCustomHeader");
return; // Short-circuit the pipeline
}
await _next(context);
}
}
ASP.NET Core 支持开箱即用的依赖关系注入 (DI)。你可以将服务注入到中间件中,就像在控制器中一样。
下面是一个将日志记录服务注入中间件的示例:
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LoggingMiddleware> _logger;
public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
_logger.LogInformation($"Request URL: {context.Request.Path}");
await _next(context);
}
}
在 中,确保已注册日志记录服务:Program.cs
builder.Services.AddLogging();
中间件是 ASP.NET Core .NET 8 的关键组件,允许您以灵活的模块化方式处理请求和响应。在这篇博客中,我们探讨了:
通过有效地了解和使用中间件,您可以控制应用程序处理请求和构建响应的方式。这项基本技能将帮助您在 ASP.NET Core 中设计可扩展、可维护且安全的 Web 应用程序。