2022年8月19日

ASP.NET Core Middleware

Middleware

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

參考

  1. OWIN:http://owin.org/
  1. Asp.net 5.0 中介軟體:https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0

2022年8月18日

ASP.NET Core 專案目錄

ASP.NET Core 專案目錄

 




目錄 作用
wwwroot; 靜態資料夾
Properties/launchSettings.json 透過dotnet run 啟動
Program.cs 程式進入點啟動
appsettins.json; 環環境參數
MVC
View 檢視
Model 模型
controller 控制器
WebApp
Razor 前端html產生工具
Web Api
controllers 控制器
Blazor
Pages 頁面
Pages/_Host.cshtml 首頁
Pages/*.razor razor頁面
Shared 共用元件資料夾
Data 資料儲存類別所在資料夾
gPRC
Protos Protocol Buffer File
Pages/_Host.cshtml 首頁
Service 服務類別