Middleware
微軟在net core開始使用OWIN[1],使用Host/Server/Middleware/Application 分層架構,讓服務可以不侷限在IIS上面,將前端Request / Response 是由 Middleware 方式處理。
介紹
中介軟體是介於作業系統及其中執行應用程式之間的軟體,讓通訊及資料管理得以進行。中介軟體為組成應用程式管線的軟體,用以處理要求與回應。 每個元件:[2]
- 可選擇是否要將要求傳送到管線中的下一個元件。
- 可以下一個元件的前後執行工作。
Middleware由多個管線所組成,會一個個串接相連,先由Request由上往下執行,Response會再回傳回來.
官方圖式說明
方法
Middleware使用IApplicationBuilder擴充方法,串接Request/Respone
- Run
Run最後一個呼叫,不會有next(),後面還有pipe也不會執行,以下範例只會出現Hellow World不會有執行第二段的Run
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (HttpContext context) =>
{
await context.Response.WriteAsync("Hellow World");
});
//不會執行
app.Run(async (HttpContext context) =>
{
await context.Response.WriteAsync("Hellow World2");
});
}
- Use
Use用來自訂Middleware的方法並多個要求委派鏈結在一起,只要透過next()就可以直接呼叫下一個middleware.他的呼叫方式有點像遞迴的方式呼叫.如果執行中出現next()調至下一個Use直到找到Run()執行後,才會返回呼叫.
app.Use(async(context,next) =>
{
await context.Response.WriteAsync("Normal Page 2 Starting\r\n");
await next();
await context.Response.WriteAsync("Normal Page 2 Ending\r\n");
});
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Normal Page 3 Starting\r\n");
await next();
await context.Response.WriteAsync("Normal Page 3 Ending\r\n");
});
//此步驟必須有才會有返回call呼叫
app.Run(async (HttpContext context) =>
{
await context.Response.WriteAsync("Run ==> 有Run才會返回Ending的工作\r\n");
});
結果:
Normal Page 1 Starting
Normal Page 2 Starting
Normal Page 3 Starting
Run ==> 有Run才會返回Ending的工作
Normal Page 3 Ending
Normal Page 2 Ending
Normal Page 1 Ending
- Map
Map會依據指定要求路徑的相符項目將要求管線分支。 如果要求路徑以指定路徑為開頭,則會執行分支
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest1);
}
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 1");
});
}
private static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 2");
});
}
Map支援槽狀
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
內建的中介軟體
中介軟體 | 描述 | 單 | Title |
---|---|---|---|
驗證 | 提供驗證支援。 | 在需要 HttpContext.User 之前。 OAuth 回呼的終端機。 | Untitled |
授權 | 提供授權支援。 | 緊接在驗證中介軟體之後。 | Untitled |
Cookie 原則 | 追蹤使用者對用於儲存個人資訊的同意,並強制執行 cookie 欄位的最低標準,例如 secure 和 SameSite 。 | 在發出 cookie 的中介軟體之前。 範例:驗證、工作階段、MVC (TempData)。 | Untitled |
CORS | 設定跨原始來源資源共用。 | 在使用 CORS 的元件之前。 由於這個錯誤,UseCors 目前必須在 UseResponseCaching 之前進行。 | Untitled |
診斷 | 數個不同的中介軟體,可提供開發人員例外狀況頁面、例外狀況處理、狀態字碼頁,以及新應用程式的預設網頁。 | 在產生錯誤的元件之前。 例外狀況的終端機,或為新應用程式提供預設網頁。 | Untitled |
轉送標頭 | 將設為 Proxy 的標頭轉送到目前要求。 | 在使用更新方法的欄位之前。 範例:配置、主機,用戶端 IP、方法。 | Untitled |
健康狀態檢查 | 檢查 ASP.NET Core 應用程式及其相依性的健康狀態,例如檢查資料庫可用性。 | 若某項要求與健康狀態檢查端點相符,則會是終端機。 | Untitled |
標頭傳播 | 將 HTTP 標頭從傳入要求傳播至傳出 HTTP 用戶端要求。 | Untitled | |
HTTP 方法覆寫 | 允許傳入的 POST 要求覆寫方法。 | 在使用更新方法的元件之前。 | Untitled |
HTTPS 重新導向 | 將所有 HTTP 要求都重新導向至 HTTPS。 | 在使用 URL 的元件之前。 | Untitled |
HTTP 嚴格的傳輸安全性 (HSTS) | 增強安全性的中介軟體,可新增特殊的回應標頭。 | 在傳送回應前和修改要求的元件後。 範例:轉送的標頭、URL 重寫。 | Untitled |
MVC | 使用 MVC/Razor Pages 處理要求。 | 若要求符合路由則終止。 | Untitled |
OWIN | 以 OWIN 為基礎之應用程式、伺服器和中介軟體的 Interop。 | 若 OWIN 中介軟體完全處理要求則終止。 | Untitled |
回應快取 | 提供快取回應的支援。 | 在需要快取的元件之前。 UseCORS 必須位於 UseResponseCaching 之前。 | Untitled |
回應壓縮 | 提供壓縮回應的支援。 | 在需要壓縮的元件之前。 | Untitled |
要求當地語系化 | 提供當地語系化支援。 | 在偵測當地語系化的元件之前。 使用 RouteDataRequestCultureProvider 時,必須在路由中介軟體之後出現。 | Untitled |
端點路由 | 定義並限制要求路由。 | 比對路由的終端機。 | Untitled |
SPA | 傳回單一頁面應用程式 (SPA) 的預設頁面,以處理中介軟體鏈結中從這裡開始的所有要求 | 鏈結中的晚期,讓用於提供靜態檔案、MVC 動作等的其他中介軟體優先。 | Untitled |
工作階段 | 提供管理使用者工作階段的支援。 | 在需要工作階段的元件之前。 | Untitled |
靜態檔案 | 支援靜態檔案的提供和目錄瀏覽。 | 若要求符合檔案則終止。 | Untitled |
URL 重寫 | 提供重寫 URL 及重新導向要求的支援。 | 在使用 URL 的元件之前。 | Untitled |
WebSocket | 啟用 WebSockets 通訊協定。 | 在接受 WebSocket 要求的必要元件之前。 | Untitled |
參考
- OWIN:http://owin.org/
- Asp.net 5.0 中介軟體:https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0
留言
張貼留言