什麼是中介軟體?
這裡引用官方解釋:
中介軟體是用於組成應用程式管道來處理請求和響應的元件。管道內的每一個元件都可以選擇是否將請求交給下一個元件、並在管道中呼叫下一個元件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個 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>()進行新增,我這裡是單獨做了一個派生類,方便管理吧。
好了,然後我們啟動程式,大家會發現我們剛才新增的中介軟體處理請求資訊: