Asp.Net Core入門之自定義中介軟體

跳躍的鍵盤手發表於2020-06-17

什麼是中介軟體?

這裡引用官方解釋:

       中介軟體是用於組成應用程式管道來處理請求和響應的元件。管道內的每一個元件都可以選擇是否將請求交給下一個元件、並在管道中呼叫下一個元件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個 HTTP 請求。

       請求委託通過使用 IApplicationBuilder 型別的 Run、Map 以及 Use 擴充套件方法來配置,並在 Startup 類中傳給 Configure 方法 。每個單獨的請求委託都可以被指定為一個內嵌匿名方法,或其定義在一個可重用的類中。這些可重用的類被稱作 中介軟體 或 中介軟體元件。每個位於請求管道內的中介軟體元件負責呼叫管道中下一個元件,或適時短路呼叫鏈。

       ASP.NET 請求管道由一系列的請求委託所構成,它們一個接著一個被呼叫,如圖所示(該執行執行緒按黑色箭頭的順序執行):

 request-delegate-pipeline

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>()進行新增,我這裡是單獨做了一個派生類,方便管理吧。

 

好了,然後我們啟動程式,大家會發現我們剛才新增的中介軟體處理請求資訊:

 

相關文章