ASP.NET Core Middleware Pipeline

一、Middleware的本质?

在 ASP.NET Core 中,Middleware 是处理 HTTP 请求的核心组件,它们按照特定的顺序组成一个“管道”,每个 Middleware 都是对请求或响应的某种处理。

二、什么是 Middleware Pipeline?

Middleware Pipeline(中间件管道)是请求处理流程的序列,它决定了请求如何从客户端到达服务器并最终返回响应。每个中间件在此管道中都可以执行以下操作:

 

  • 拦截请求:在请求到达处理逻辑(如控制器)之前修改请求。

 

  • 处理请求:执行一些业务逻辑(例如认证、授权、日志记录等)。

  • 拦截响应:在响应返回客户端之前,修改响应内容。

三、创建和配置 Middleware Pipeline 

 1 using Middleware.Test.Api.Middleware;
 2 
 3 namespace Middleware.Test.Api
 4 {
 5     public class Program
 6     {
 7         public static void Main(string[] args)
 8         {
 9             var builder = WebApplication.CreateBuilder(args);
10 
11             // Add services to the container.
12 
13             builder.Services.AddControllers();
14             // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
15             builder.Services.AddOpenApi();
16 
17             var app = builder.Build();
18 
19             // Configure the HTTP request pipeline.
20             if (app.Environment.IsDevelopment())
21             {
22                 app.MapOpenApi();
23             }
24 
25             app.UseHttpsRedirection();
26 
27             app.UseAuthorization();
28 
29             //Map 会在原始管道的基础上增加分支管道,只有路径匹配时才会进入该分支管道。
30             //原来的管道也会执行
31             app.Map("/map1/seg1", HandleMultiSeg);
32 
33 
34             //自定义中间件1
35             app.Use(async (context, next) =>
36             {
37                 Console.WriteLine("Request started");
38                 await next();
39                 Console.WriteLine("Request completed");
40             });
41 
42             //自定义中间件引入,可以重复引入不报错,都会执行
43             app.UseMiddleware<TestMiddleware>();
44             app.UseTestMiddleware();
45             app.UseMiddleware<TestMiddleware>();
46 
47             //短路,请求进来,执行到Run就会返回,不会在执行下去
48             //下面的MapConteroller就不会被执行,所以,控制器中的APi请求都是返回 Hello world!
49             app.Run(async context =>
50             {
51                 Console.WriteLine("Hello world! Request started");
52                 await context.Response.WriteAsync("Hello world!");
53             });
54 
55             app.MapControllers();
56 
57             app.Run();
58         }
59         public static void HandleMultiSeg(IApplicationBuilder app)
60         {
61             app.UseTestMiddleware();
62             app.Run(async context =>
63             {
64                 Console.WriteLine("Map Test 1 started");
65                 await context.Response.WriteAsync("Map Test 1");
66                 Console.WriteLine("Map Test 1 Completed");
67             });
68         }
69     }
70 }
使用中间件

四、中间件的执行顺序

  • 请求阶段:请求从客户端到达服务器时,管道中的每个中间件按顺序依次执行。每个中间件有机会处理请求。

  • 响应阶段:当请求经过所有中间件后,响应返回时,管道中的中间件会倒序执行。每个中间件可以修改响应内容。

五、创建自定义 Middleware

 1 namespace Middleware.Test.Api.Middleware
 2 {
 3     public class TestMiddleware
 4     {
 5         private readonly RequestDelegate _next;
 6 
 7         public TestMiddleware(RequestDelegate next)
 8         {
 9             _next = next;
10         }
11 
12         public async Task Invoke(HttpContext context)
13         {
14             // 在请求处理前做一些事情(例如日志记录、身份验证等)
15             Console.WriteLine("TestCustom Request started at: " + DateTime.Now);
16 
17             await _next(context);
18 
19             // 在响应返回前做一些事情(例如修改响应、记录日志等)
20             Console.WriteLine("TestCustom Response sent at: " + DateTime.Now);
21         }
22 
23     }
24 
25     /// <summary>
26     /// 提供扩展方法注入中间件
27     /// 也可以在Program中直接app.UseMiddleware<TestMiddleware>();
28     /// </summary>
29     public static class TestMiddlewareExtensions
30     {
31         public static IApplicationBuilder UseTestMiddleware(this IApplicationBuilder app)
32         {
33             return app.UseMiddleware<TestMiddleware>();
34         }
35     }
36 }
自定义中间件

 

posted @ 2025-12-07 23:18  是铭不是明  阅读(10)  评论(0)    收藏  举报