跳到主要內容

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

留言

這個網誌中的熱門文章

GSON基礎教學

GSON 前言 JSON是很常見的資料交換格式,在JAVA領域常用處理JSON的函式庫:GSON、FastXML和JSON-B,本章節會以GSON為主,學習目標如下 JSON格式說明 GSON 套件函式 GSON: 物件轉換JSON字串 GSON: JSON字串轉換物件 JSON 格式說明 JSON全名為JavaScript Object Notation,它是一種輕量級的資料交換格式,會大為流行的理由,主要是他比傳統用xml更輕巧且容易處理, JSON表達方式物件會用大括弧{},陣列則是用中括號[]。 用JSON字串來表達Employee的物件內容,由JSON字串可以知道物件name、age、sex和salary屬性。 JSON表示員工資料方式: {“name”:”Jack Bryant”, “age”:18, “sex”:”M”,”salary”:3500.00} JSON陣列表示方式: 跟我們使用JAVA的陣列方式類似,內容值可以是數字’、文字、布林、陣列、物件、null等等。 範例: 字串: [“紅”、”橙”、”黃”、”綠”、”青”、”藍”、”紫”} 布林: [true, true, false, false, true, true] GSON 套件函式 Gson為google所發布的函式庫,主要將物件與json字串之間的轉換時方便使用。當我們將JAVA物件轉換成JSON字串稱為 序列化 ,JSON字串轉換至JAVA物件稱為 反序列化 。 GSON: 物件轉換JSON字串 有了JSON基本概念後,我們進入本章重點,首先我們需要建立員工類別(Employee),定義如下 物件 屬性 員工類別 Employee name 名字 age 年紀 sex 性別 salary 薪水 /** * name:員工類別 */ public class Employee implements Serializable { //constructor public Employee(String name, double salary){ this.name = name; this.sala...

PHP與Python搭配

今天介紹如何利用php網頁呼叫目錄下的python程式工作或是資料交換,本人整理的方法有兩種 使用system()、exec()、shell_exec()呼叫程式 (1) string system ( string return_var ] ) 參考網址 官網解釋system()用來執行外部命令,返回為印出的結果,passthru()跟system()類似但是它不會返回結果。 範例1. 利用system執行ls指定並顯示在網頁上,無法使用變數保留ls的結果 檔案名稱: psystem.php $jsondata= system("ls -al", $result); 結果: (2) exec() : string exec ( string output [, int &$return_var ]] ) 參考網址 範例2. 利用exec執行python程式並可以回傳json格式給前端網頁做處理並顯示。我們ptopy.php就是可以看到callpy()為執行py的函式,它執行完pyEx01.py會將結果給$jsondata變數,做後面json解析。 檔案名稱: ptopy.php function callpy() { $jsondata= exec("/usr/bin/python pyEx01.py"); return $jsondata ; } $jsondata= callpy(); echo $jsondata ; echo " " ; $obj = json_decode($jsondata) ; echo "name:".$obj-> { 'name'} .',' ; echo "id:".$obj-> { 'id'} ; 檔案名稱: pyEx01.py import sys ...

Python AI-問題集

Python AI-問題集 問題集 Jupyter Notebook執行ipywidgets會出現kernel死掉的錯誤發生(The kernel appears to have died) 解決方法 (1) 根據log檔來判斷問題: 例如:log訊息出現OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized. (2) 根據問題關鍵字找出問題所在: 利用google查詢所遭遇到的問題,例如我把上面的問題上google查詢可以找到這篇的解法 https://blog.csdn.net/bingjianIT/article/details/86182096 (3)實作解法: 我實作下面解法後,就可以順利執行手寫辨識的程式. //在Python宣告時加入 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" 參考 https://blog.csdn.net/bingjianIT/article/details/86182096