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 }

浙公网安备 33010602011771号