什么是中間件?
這里引用官方解釋:
中間件是用於組成應用程序管道來處理請求和響應的組件。管道內的每一個組件都可以選擇是否將請求交給下一個組件、並在管道中調用下一個組件之前和之后執行某些操作。請求委托被用來建立請求管道,請求委托處理每一個 HTTP 請求。
請求委托通過使用 IApplicationBuilder 類型的 Run、Map 以及 Use 擴展方法來配置,並在 Startup
類中傳給 Configure
方法 。每個單獨的請求委托都可以被指定為一個內嵌匿名方法,或其定義在一個可重用的類中。這些可重用的類被稱作 中間件 或 中間件組件。每個位於請求管道內的中間件組件負責調用管道中下一個組件,或適時短路調用鏈。
ASP.NET 請求管道由一系列的請求委托所構成,它們一個接着一個被調用,如圖所示(該執行線程按黑色箭頭的順序執行):
ASP.Net Core內置很多中間件,如:靜態文件,身份驗證,MVC等。
這里需要注意的是,中間件添加的順序非常重要,這會影響他們處理請求的順序。如果順序添加不對,很可能其中某個中間件會造成管道短路,不能觸發下一個請求委托,造成系統異常。
自定義中間件
1.自定義中間件處理邏輯。
1 public class MyMiddleWare 2 { 3 private readonly ILogger logger; 4 private readonly RequestDelegate next; 5 /// <summary> 6 /// 通過構造函數 注入Logger日志和Http請求委托 7 /// </summary> 8 /// <param name="_logger"></param> 9 /// <param name="_next"></param> 10 public MyMiddleWare(ILogger<MyMiddleWare> _logger, RequestDelegate _next) 11 { 12 logger = _logger; 13 next = _next; 14 } 15 16 /// <summary> 17 /// 在調用下一個組件之前和之后執行某些操作 18 /// </summary> 19 /// <param name="context"></param> 20 /// <returns></returns> 21 public async Task Invoke(HttpContext context) 22 { 23 logger.LogInformation("自定義中間件,開始" + DateTime.Now); 24 await next.Invoke(context); 25 logger.LogInformation("自定義中間件,結束" + DateTime.Now); 26 } 27 }
2.使用IApplicationBuilder向應用程序的請求管道添加中間件
1 public static class ServiceExtensions 2 { 3 public static IApplicationBuilder UserMyMiddleWare(this IApplicationBuilder app) 4 { 5 return app.UseMiddleware<MyMiddleWare>(); 6 } 7 }
3.通過Configure方法添加自定義中間件。
Configure
方法用於指定 ASP.NET 應用程序將如何響應每一個 HTTP 請求。中間件需要最終在這里添加。
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 if (env.IsDevelopment()) 4 { 5 app.UseDeveloperExceptionPage(); 6 } 7 //wwroot目錄下靜態文件 8 app.UseStaticFiles(); 9 //添加自定義中間件 10 app.UserMyMiddleWare(); 11 }
當然大家也可以在Configure
方法中直接使用 app.UseMiddleware<MyMiddleWare>()進行添加,我這里是單獨做了一個派生類,方便管理吧。
好了,然后我們啟動程序,大家會發現我們剛才添加的中間件處理請求信息: