1. 基本概念
在ASP.NET Core中,中介軟體和過濾器都是處理HTTP請求的重要元件,但它們在應用中的位置、作用範圍以及使用方式有所不同。
1.1 中介軟體和過濾器的區別
1.1.1 中介軟體
-
位置與作用範圍:中介軟體位於ASP.NET Core應用程式請求處理管道的核心位置,它可以處理進入應用程式的每一個HTTP請求和響應。中介軟體按照定義的順序執行,每個中介軟體都有機會處理請求,或者將請求傳遞給管道中的下一個中介軟體。這意味著中介軟體具有更廣泛的控制能力,可以對整個應用程式的所有請求進行攔截和處理。
-
功能:中介軟體通常用於執行跨-cutting關注點的任務,比如錯誤處理、日誌記錄、身份驗證、路由、靜態檔案服務等。它們可以讀取、修改請求和響應物件,或者短路請求鏈,直接向客戶端傳送響應。
-
實現方式:中介軟體通常由一個或多個委託( Delegate )組成,這些委託會在應用程式啟動時被新增到請求處理管道中。可以透過實現
IMiddleware
介面或使用中介軟體工廠方法來建立自定義中介軟體。
1.1.2 過濾器
-
位置與作用範圍:過濾器則更加專注於MVC應用程式內部,特別是針對控制器和操作方法的請求處理流程。它們只在MVC處理請求的特定階段生效,不會影響到非MVC路徑的請求。
-
型別與功能:ASP.NET Core MVC支援多種型別的過濾器,包括但不限於:
IResourceFilter
和IAsyncResourceFilter
:最早和最晚執行的過濾器,用於資源級別的操作。IActionFilter
和IAsyncActionFilter
:在執行操作方法前後執行,可以用來修改操作引數或結果。IAuthorizationFilter
和IAsyncAuthorizationFilter
:用於處理授權邏輯。IExceptionFilter
和IAsyncExceptionFilter
:捕獲並處理操作方法中丟擲的異常。IResultFilter
和IAsyncResultFilter
:在執行操作結果之前和之後執行,可以用來修改結果或響應。
-
實現方式:過濾器可以透過實現相應的介面並應用特性(Attribute)到控制器或操作方法上來定義。也可以透過在Startup.cs的ConfigureServices方法中註冊全域性過濾器。
總結來說,中介軟體提供了對整個應用程式請求處理流程的低階控制,而過濾器則更加專注於MVC框架內的特定操作和控制器,提供了一種更細粒度的處理和干預方式。兩者結合使用,可以構建出既強大又靈活的應用程式請求處理架構。
1.2 Asp.Net Core中有哪些內建過濾器,它們的呼叫順序是怎樣的
在ASP.NET MVC(包括ASP.NET Core MVC)框架中,過濾器是用來在特定的執行階段插入自定義邏輯的元件。過濾器主要分為以下幾種型別,並按照特定的順序執行:
-
授權過濾器 (Authorization Filters): 這些過濾器首先執行,用於檢查使用者是否有許可權執行接下來的操作。例如,可以在這裡實現角色檢查或者JWT令牌驗證。
-
資源過濾器 (Resource Filters): 包括
IResourceFilter
和IAsyncResourceFilter
,它們在授權過濾器之後但在操作方法執行前執行。這些過濾器可用於執行一些早期或晚期的資源處理邏輯。 -
操作過濾器 (Action Filters): 分為
IActionFilter
和IAsyncActionFilter
。操作過濾器在資源過濾器之後,在操作方法執行前後分別呼叫。它們常用於日誌記錄、修改操作引數或結果等。- OnActionExecuting: 在操作方法執行前呼叫。
- OnActionExecuted: 在操作方法執行後呼叫,無論操作是否成功。
-
結果過濾器 (Result Filters): 包括
IResultFilter
和IAsyncResultFilter
。這些過濾器在操作方法執行完畢且操作結果已知後呼叫,但在實際的結果執行之前或之後。- OnResultExecuting: 在操作結果執行前呼叫。
- OnResultExecuted: 在操作結果執行後呼叫。
-
異常過濾器 (Exception Filters): 如果在前面任何階段發生未處理異常,
IExceptionFilter
或IAsyncExceptionFilter
將被執行,用於捕獲和處理這些異常。如果在Action過濾器或Result過濾器中丟擲了異常,也會執行這裡的邏輯。
注意,如果在Action過濾器中丟擲了異常,將不會執行Result過濾器,而是直接跳轉到異常過濾器。此外,如果在同一個階段註冊了多個過濾器(例如,多個操作過濾器),它們將按照註冊順序執行。
過濾器可以在全域性、控制器級別或操作方法級別應用,遵循的原則是:
- 控制器上的過濾器優先於方法上的過濾器。
- 同一級別的過濾器按照註冊順序執行。
這個順序確保了從請求驗證到最終響應生成的流程中,每個階段都可以插入定製化的處理邏輯。
1.3 Asp.Net Core中有哪些中介軟體,它們的呼叫順序是怎樣的
1.3.1 內建中介軟體
ASP.NET Core 提供了一系列內建的中介軟體,這些中介軟體覆蓋了從基本的請求處理到高階功能的廣泛需求。以下是一些常用的內建中介軟體:
-
Static Files:用於提供網站的靜態資源,如CSS、JavaScript和影像檔案。
-
Routing:路由中介軟體,用於根據URL對映到具體的控制器和操作方法。
-
Authentication:身份驗證中介軟體,支援多種認證方案,如Cookie、Bearer Tokens、OAuth等。
-
Authorization:授權中介軟體,用於控制對資源的訪問許可權。
-
Session:會話中介軟體,提供跨請求的資料儲存支援。
-
Cors:跨源資源共享(CORS)中介軟體,允許伺服器指定哪些來源的請求可以訪問其資源。
-
Forwarded Headers:轉發標頭中介軟體,處理代理伺服器和負載均衡器設定的HTTP標頭。
-
Hsts:HTTP嚴格傳輸安全(HSTS)中介軟體,強制瀏覽器透過HTTPS與伺服器通訊。
-
Https Redirection:HTTPS重定向中介軟體,自動將HTTP請求重定向到HTTPS。
-
Response Caching:響應快取中介軟體,用於快取和重用常見的響應以提高效能。
-
Compression:壓縮中介軟體,用於壓縮HTTP響應體,減少網路傳輸量。
-
Developer Exception Page:開發者異常頁面中介軟體,在開發環境中顯示詳細的錯誤資訊。
-
ExceptionHandler:異常處理中介軟體,用於統一處理未被捕獲的異常並返回友好的錯誤響應。
-
UseStatusCodePages:狀態碼頁面中介軟體,自定義HTTP狀態碼頁面。
-
Swagger / OpenAPI:雖然不是完全內建,但透過NuGet包可輕鬆整合,用於生成RESTful API的文件。
除了這些內建中介軟體,ASP.NET Core還支援開發自定義中介軟體,以滿足特定應用程式的需求。自定義中介軟體可以透過實現IMiddleware
介面或使用Lambda表示式定義,來插入到請求處理管道中,實現高度定製化的功能處理。
1.3.2 呼叫順序
ASP.NET Core 中內建中介軟體的呼叫順序直接取決於你在 Startup.cs 檔案的 Configure 方法中新增它們的順序。當你使用 app.UseXXX 方法新增中介軟體時,它們會按照程式碼中從上到下的順序被新增到請求處理管道中。
例如,如果你有以下的配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<CustomMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
中介軟體的呼叫順序將是:
- UseRouting: 配置路由相關的服務,這是處理路由的第一步,用於確定請求的終結點。
- UseAuthentication: 應用身份驗證邏輯,嘗試驗證請求的身份。
- UseAuthorization: 應用授權邏輯,判斷已認證的使用者是否有許可權訪問請求的資源。
- UseMiddleware<CustomMiddleware>: 自定義中介軟體,按照你的邏輯執行。
- UseEndpoints: 配置終結點,這裡是對映MVC控制器和操作方法或其他終結點,是管道中的最後一個環節,負責將請求分發到具體的處理程式。
請求會從上到下依次經過這些中介軟體,每個中介軟體可以選擇是否將請求傳遞給管道中的下一個中介軟體。如果呼叫了 next
函式(或者在Lambda表示式中為 await next.Invoke()
),控制權就會傳遞給下一個中介軟體。響應時,流程會逆序返回,讓每個中介軟體有機會處理響應。
因此,定義中介軟體的順序對於安全性、效能和功能的實現至關重要。例如,身份驗證和授權中介軟體通常需要放在處理具體請求邏輯的中介軟體之前。
1.4 使用中介軟體還是過濾器?如何選擇
在Web開發中,過濾器(Filters)和中介軟體(Middleware)都是用於處理進入應用程式的HTTP請求和響應的元件,但它們在使用場景和功能定位上有所不同。
使用過濾器的情景:
-
細粒度操作控制:當你需要對特定的控制器或動作方法執行前後的處理邏輯進行控制時,如身份驗證、授權、日誌記錄、修改模型繫結的輸入或輸出等,使用操作過濾器更為合適。
-
特定請求或響應處理:如果你的處理邏輯只與某個具體操作相關,例如格式化輸出、異常處理等,使用操作過濾器或結果過濾器可以針對性地處理這些需求。
-
安全和認證:在需要對使用者訪問許可權進行細緻控制時,如基於角色的訪問控制(RBAC),授權過濾器是非常有用的工具。
使用中介軟體的情景:
-
全域性處理邏輯:當需要對所有進入應用的請求或響應進行統一處理時,比如跨域請求(CORS)設定、請求日誌記錄、錯誤處理、請求管道的初始化和終止等,中介軟體是更好的選擇。
-
鏈式處理:中介軟體可以連結在一起形成請求處理管道,每個中介軟體可以決定是否將請求傳遞給管道中的下一個中介軟體,這使得它們非常適合執行一系列連續的處理步驟。
-
效能監控和最佳化:對於需要在整個應用層面監控請求效能或執行初步請求驗證(如檢查請求頭)的場景,中介軟體提供了一個全域性的介入點。
簡而言之,過濾器更適合於處理與具體操作相關的細節邏輯,而中介軟體則更適用於全域性性的、跨越多個控制器或操作的處理邏輯。 在設計應用程式架構時,理解兩者之間的區別併合理搭配使用,可以有效提升應用的靈活性和可維護性。