2021年3月21日 星期日

ASP.NET Core 3.1 認識 Middleware

前篇文章有提到 middleware ,這邊就來介紹一下(亦可參考官網)。 在前文中有提到

Http Request / Response 「Pipeline 」這個名詞。



而 Pieline 有點像下圖,千層派的感覺,最先加入的Middleware 就會最外圈,也就最先被Request 觸發,

從外而內在由內而外,最後 Response 會觸發最外圈的Middleware。




因為會有若干的Middleware 加入,這順序有點像「先進後出」 ,下圖為流程。

(來源)

如上圖所示,在 Middleware 1 處理完相關邏輯,須往下個流程走時,會呼叫 next() 方法,

順利走到底後會再一層層返回,最後就是 Response;其實最後的Middleware 後面會接

ActionFilter,那就進入Filter 的流程了(可參考),這邊不深究。


之前的文章有提到,在 Startup.cs 類別裡面的 Configure 方法,就是設定 Middleware,

如下圖,各Use方法(e.g app.UseRouting )裡面的實作幾乎都是加入Middleware。



先知道一下 Request 會先經過 Middleware ,才會進入MVC Endpoint ,意即middleware 跑完才會

進入 action filter 的執行領域,可參考下圖。

(參考)


所以,透過這樣的機制與特性,可以設計相關應用,如設定例外錯誤的捕捉並且

回傳或導頁指定狀態碼及頁面,這部分再看看後續文章有沒有機會介紹到。




先來試試怎麼加入新的 Middleware 呢?


可以使用UseRunMap 擴充方法設定委派,並且使用 next.Invoke() 將訊息往下一個 middleware 送


先來看以下這個例子,從第11 行開始,加入若干 Middleware


若是網址走預設路由,則輸出應該是 First、Second in → Hello World! → Second 、First out,如下圖


若是走Map路由,則輸出First、Map in → Map Hello World! → Map、First out,如下圖


其中,執行順序是依照Middleware 加入的順序。


Map 就是判斷若為特定路由時,即進入方法並可設定委派,進入該方法後,第32行的

Second Middle 以及 39 行的 Hello World 也不會執行


另外 UseRun 的差異是,Use 可以往下串 Middle ,而 Run 方法僅能有一個 handler 委派參數

content 沒有 next ,故若是我們調整在 First 之後直接接 Run 後面的Second 就不會執行

如下圖


關於Run 的使用,可參考以下圖片

(參考)



再介紹一個函式,叫 UserWhen,若有其他判斷可再將 app 再傳給另外的委派,如下



順道提一下,在ASP.NET Core Web 環境(非API),預設會有UseEndpoints 方法,如下圖


若將要新增的Middleware 放到這個方法之後,則都不會被執行,故這個方法大都放到最後。


這邊對 Middleware 基本介紹,後續再看看自訂Middleware 類別的部分。


沒有留言:

張貼留言