ASP.NET Core .NET 8 中间件的完整初学者指南

作者:微信公众号:【架构师老卢】
10-4 8:52
389

中间件是 ASP.NET Core 中的一个核心概念,在处理 HTTP 请求和响应方面起着至关重要的作用。如果您刚接触 ASP.NET Core,了解中间件至关重要,因为它构成了 Web 应用程序中请求处理的主干。

在此综合博客中,您将了解:

  • ASP.NET Core .NET 8 中的中间件是什么。
  • 中间件在请求管道中扮演的角色。
  • 如何创建和配置内置和自定义中间件。
  • 中间件执行顺序及其重要性。
  • 一个巩固您理解的实际示例。

让我们开始吧!

什么是 ASP.NET Core 中的中间件?

ASP.NET Core 中的中间件是指组装到应用程序管道中以处理请求和响应的软件组件。每个中间件都会在流经管道时处理 HTTP 请求,并且可以:

  • 处理请求并选择性地修改 HTTP 响应。
  • 将请求传递给管道中的下一个中间件。

这种模块化方法为开发人员在构建 Web 应用程序时提供了很大的灵活性,因为他们可以轻松配置各种组件来处理安全性、日志记录、路由、错误处理等。

中间件特别适用于:

  • 记录请求/响应信息。
  • 对用户进行身份验证授权
  • 处理错误和自定义错误页面
  • 提供静态文件(如 JavaScript、CSS 或图像)。
  • 将请求路由到正确的终端节点。

中间件在 ASP.NET Core .NET 8 中的工作原理

当 HTTP 请求到达服务器时,ASP.NET Core 会通过一系列中间件组件传递请求。每个中间件组件可以:

  1. 检查请求。
  2. 修改请求或响应。
  3. 使管道短路(例如,立即发回响应)。
  4. 调用管道中的下一个中间件

这称为请求-响应管道。中间件组件可以将控制权传递给下一个组件,也可以通过发送响应来结束管道。

以下是中间件管道的基本图示:

Incoming HTTP Request → Middleware 1 → Middleware 2 → ... → Endpoint
Outgoing HTTP Response ← Middleware N ← Middleware (N-1) ← ... ← Endpoint

ASP.NET Core 中的中间件:关键概念

1. 请求委托

Middleware 是一个委托,它接受一个对象并返回一个 .这表示管道中的下一个中间件,允许每个组件处理请求或传递请求。HttpContextTaskRequestDelegate

2. HttpContext

该对象包含有关当前 HTTP 请求和响应的信息,包括 Header、body、Query Parameters、User Information 等。中间件组件与此上下文交互以操作流。HttpContext

ASP.NET Core 中的内置中间件组件

ASP.NET Core 附带了几个用于常见任务的预定义中间件组件。以下是一些最常用的内置中间件:

  1. 路由中间件 ()
    定义如何将请求路由到控制器或 Razor Pages 等终结点。UseRouting
  2. 身份验证中间件 ()
    根据配置的身份验证机制验证用户身份。UseAuthentication
  3. 授权中间件 ()
    确保用户有权访问请求的资源。UseAuthorization
  4. 静态文件中间件 ()
    提供静态文件,如 CSS、图像和 JavaScript。UseStaticFiles
  5. 异常处理中间件 ()
    处理异常并提供自定义错误处理逻辑。UseExceptionHandler
  6. Cors 中间件 ()
    控制出于安全目的如何处理跨域请求。UseCors

自定义中间件:分步指南

现在,让我们创建一个自定义中间件来记录传入的请求。这将帮助您了解中间件在后台是如何工作的,以及如何构建自己的组件。

第 1 步:创建 ASP.NET Core 项目

  1. 打开 Visual Studio 或首选 IDE。
  2. 创建面向 .NET 8 的新 ASP.NET Core Web API 项目。
  3. 为您的项目命名(例如 )。MiddlewareDemo

第 2 步:创建自定义中间件类

在项目的根目录中,添加一个名为 的新类。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}");
    }
}

解释:

  • 中间件有一个构造函数,该构造函数接受 to 指向管道中的下一个中间件。RequestDelegate
  • 该方法是中间件 logic 所在的位置。它记录 HTTP 请求方法和路径,将请求传递给下一个中间件,然后记录响应的状态代码。InvokeAsync

第 3 步:在 Pipeline 中注册中间件

在 中,通过注册自定义中间件来修改中间件管道。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

第 4 步:测试 Middleware

运行应用程序并使用 PostmanCurl 或 Web 浏览器发出请求。您应该会在控制台中看到请求方法、路径和响应状态的日志。

了解中间件执行顺序

中间件组件添加到管道中的顺序至关重要,因为它决定了它们处理请求的顺序。在管道中较早添加的中间件在处理传入请求时首先执行,最后在处理传出响应时执行。

下面是一个示例来说明顺序:

app.UseMiddleware<FirstMiddleware>();  
app.UseMiddleware<SecondMiddleware>();  
app.UseMiddleware<ThirdMiddleware>();
  1. 请求: → → .FirstMiddlewareSecondMiddlewareThirdMiddleware
  2. 响应: → → .ThirdMiddlewareSecondMiddlewareFirstMiddleware

中间件短路

中间件可以使管道短路,这意味着它可以阻止请求进一步沿链向下传递并直接发送响应。例如,如果身份验证中间件检测到无效的令牌,它可能会立即返回响应,而不会将请求传递给后续中间件。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 应用程序。

相关留言评论
昵称:
邮箱:
阅读排行