ZetCode

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 中创建和使用自定义中间件。

Program.cs
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 方法为每个请求调用。扩展方法简化了将此中间件添加到管道的操作。

在 Program.cs 中使用自定义中间件
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging();

var app = builder.Build();

app.UseRequestTiming();

app.MapGet("/", () => "Hello from custom Middleware!");

app.Run();

在这里,我们注册了日志记录服务,并使用扩展方法添加了我们的自定义中间件。该中间件现在将为所有请求记录计时信息。

此示例演示了内联和基于类的中间件方法。基于类的中间件对于复杂场景更具可维护性,并支持依赖注入。

来源

Microsoft ASP.NET 中间件文档

在本文中,我们探讨了 ASP.NET 8 中的中间件。中间件提供了强大的功能来检查和修改 HTTP 请求/响应管道。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写超过 1400 篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程