Middleware 是被組裝到 app pipeline 中的軟體,用於處理 request 和 response,每一個 component 可以:

  • 決定是否要將 request 往下傳到 pipeline 的下一個 component。
  • 在 pipeline 中的下一個 component 執行前後進行作業。

Request delegates 被用來建置 request pipeline,Request delegates 處理每一個 request。

Request delegates 使用 Run, Map 以及 Use 擴展方法來設定。每一個 Request delegates 可以是特定 in-line 像是 anonymous method (又稱 in-line middleware),或者它可以被定義成可複用的類別。這些可被複用的類別以及 in-line anonymous method,我們也稱之 middleware component。Request pipeline 中的每個 middleware component 負責呼叫 pipeline 中的下一個 component,或使 pipeline 短路。當 middleware 短路時,它被稱為 terminal middleware,因為它阻止了後續的 middleware 處理該 request。

ASP.NET Core request pipeline 由一系列的 request delegates 組成,這些 delegates 會依序被呼叫。下圖將展示這個概念。

middleware.png

當一個 request 進來後,會依序經過每個 middleware。每個 middleware 先執行 before 邏輯,然後將 context 傳遞給下一個 delegate,直到最後的 middleware 處理完業務邏輯。當開始回傳 response 時,會以相反的順序 (FILO - First In Last Out) 返回,讓每個 middleware 依序執行 after 邏輯。

當 short-circuit 發生時,產生短路的 middleware 會執行他的邏輯(before 部分),接著不呼叫 next() 直接返回 response,此時會以相反的順序,讓之前已執行過 before 邏輯的 middleware 依序執行它們的 after 邏輯。

正常流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Request

[M1 before] ✓

[M2 before] ✓

[M3 before] ✓

[Business Logic] ✓

[M3 after] ✓

[M2 after] ✓

[M1 after] ✓

Response

短路流程 (M2 短路):

1
2
3
4
5
6
7
8
9
10
11
Request

[M1 before] ✓ 執行了

[M2 before] ✓ 執行了,但不呼叫 next() → 短路!

[M2 after] ✓ 執行 (如果有的話)

[M1 after] ✓ 執行

Response

ASP.NET Middleware Order

下圖將展示完整的 request processing pipeline
middleware-order.png