middleware
在 .NET Core 裡也是一個很重要的機制,來學習吧
什麼是 middleware?
middleware
就像逆滲透的濾水器,自來水 (Request) 要沿著管路 (pipeline) 經過多層的濾心 (middleware) 後,就能得到乾淨的水 (Response)。
簡單看一下在 .NET Core 內是怎麼使用的
1 | public void Configure(IApplicationBuilder app) |
這樣子系統就會依設定的順序,依序執行
IApplicationBuilder
1 | public interface IApplicationBuilder |
這裡跟 middleware 有關的,就是最後一個 Use
,如果想要加入 middleware
,就是透過 Use
這方法加入(方法之一),用以下簡單的程式碼做個說明
1 | public void Configure(IApplicationBuilder app) |
這樣的執行結果如下
重點整理
- context 的變數是代表
HttpContext
本體 - 可以從
context
裡取得Request
的資訊,也可以增加Response Headers
的內容 - 如果在
middleware
間有異動到Response
時,之後的middleware
就會失效 - 可以使用
return next()
或是await next.Invoke()
兩種方式執行下一個middleware
middleware
是有順序性的,要留意!!
進階用法:Map、MapWhen
針對不同的網址,給予不同的 Response Header
如果想要做到上述的情境,就可以利用 Map
這方法,寫法如下
1 | app.Map("/api/post", HandlePath2); |
或是這樣子寫也是可以的
1 | app.Map("/api", apiLevel => |
1 | private static void HandlePath1(IApplicationBuilder app) |
另外一種寫法是使用 MapWhen
1 | app.MapWhen(context => context.Request.Query.ContainsKey("branch"), |
**注意事項 : **
- 如果使用
Map
的話,就會與主線脫離關係了,變成是獨立的執行環境。這點要留意。 Run
、Map
、MapWhen
皆是IApplicationBuilder
的擴充方法
內建 Middleware
Middleware | Description |
---|---|
Authentication | Provides authentication support. |
CORS | Configures Cross-Origin Resource Sharing. |
Response Caching | Provides support for caching responses. |
Response Compression | Provides support for compressing responses. |
Routing | Defines and constrains request routes. |
Session | Provides support for managing user sessions. |
Static Files | Provides support for serving static files and directory browsing. |
URL Rewriting Middleware | Provides support for rewriting URLs and redirecting requests. |
自訂 Middleware
自訂 middleware
有兩種寫法,一種是如一開始使用 Use
的方式來寫,另外一種,就是寫成 Middleware
的元件,如同內建的 middleware
基本架構如下
1 | using Microsoft.AspNetCore.Http; |
要使用自己所寫的 middleware
時,有兩種方式
-
擴充
IApplicationBuilder
的方法,使用Extension Methods
的方式。1
2
3
4public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyDemoMiddleware>();
} -
利用
UseMiddleware
的方式加入1
2
3
4
5
6public void Configure(IApplicationBuilder app)
{
...
app.UseMiddleware<MyDemoMiddleware>();
...
}