ASP.NET 中间件
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的中间件。中间件组件对于处理 ASP.NET 应用程序中的 HTTP 请求和响应至关重要。
ASP.NET 中间件构成一个处理请求和响应的管道。每个组件都可以检查、修改或短路请求/响应流程。
基本定义
ASP.NET 中的中间件是组装到应用程序管道中的软件组件。它们按顺序处理 HTTP 请求和响应。
每个中间件组件都可以在管道中的下一个组件之前和之后执行操作。它们还可以决定不调用下一个组件。
中间件在 Program.cs 文件中使用 WebApplication 对象进行配置。中间件注册的顺序至关重要,因为它定义了执行顺序。
常见的内置中间件包括路由、身份验证、静态文件和 CORS。可以为应用程序特定的要求创建自定义中间件。
ASP.NET 中间件示例
以下示例演示了在 ASP.NET 8 中创建和使用自定义中间件。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Custom Middleware
app.Use(async (context, next) =>
{
Console.WriteLine($"Request started: {context.Request.Path}");
await next();
Console.WriteLine($"Request completed: {context.Request.Path}");
});
// Another custom Middleware
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Custom-Header", "Middleware-Example");
await next();
});
// Built-in Middleware
app.UseRouting();
app.UseAuthorization();
app.MapGet("/", () => "Hello from Middleware example!");
app.Run();
此示例展示了两个内联自定义中间件组件和内置中间件。第一个记录请求的开始/结束时间,第二个添加自定义标头。
Use 方法将中间件添加到管道。next 参数表示管道中的下一个中间件。调用 await next() 将控制权传递给下一个组件。
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestTimingMiddleware> _logger;
public RequestTimingMiddleware(RequestDelegate next,
ILogger<RequestTimingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var stopwatch = Stopwatch.StartNew();
try
{
await _next(context);
}
finally
{
stopwatch.Stop();
_logger.LogInformation(
$"Request {context.Request.Path} took {stopwatch.ElapsedMilliseconds}ms");
}
}
}
public static class RequestTimingMiddlewareExtensions
{
public static IApplicationBuilder UseRequestTiming(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestTimingMiddleware>();
}
}
这显示了将中间件作为单独类的一种更结构化的方法。中间件测量请求处理时间并使用 ILogger 服务将其记录下来。
RequestDelegate 代表管道中的下一个中间件。InvokeAsync 方法为每个请求调用。扩展方法简化了将此中间件添加到管道的操作。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging();
var app = builder.Build();
app.UseRequestTiming();
app.MapGet("/", () => "Hello from custom Middleware!");
app.Run();
在这里,我们注册了日志记录服务,并使用扩展方法添加了我们的自定义中间件。该中间件现在将为所有请求记录计时信息。
此示例演示了内联和基于类的中间件方法。基于类的中间件对于复杂场景更具可维护性,并支持依赖注入。
来源
在本文中,我们探讨了 ASP.NET 8 中的中间件。中间件提供了强大的功能来检查和修改 HTTP 请求/响应管道。