ASP.net 中間件#
官方文件:ASP.NET Core 中間件 | Microsoft Learn
中間件是處理 Http 請求的一系列方法。上圖演示了 Http 請求流經中間件的整個過程。
中間件採用 "管道" 方式(我更願意稱之為往返隊列)調用。
當 WebApp 擁有 ABC 三個中間件,那麼當接收到請求後,會依次執行 ABC前處理,再返程執行 CBA後處理
public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// 在請求前進行處理
await _next(context);
// 在請求後進行處理
}
}
Invoke
方法在中間件中起到了關鍵的作用,它負責將請求流轉到下一個中間件或終端處理程序,並且在返回時自動執行後處理邏輯。
通過使用 Invoke
方法,可以將中間件的前處理和後處理邏輯組織在一起,使代碼結構更加簡潔和清晰。而且,使用 _next(context)
調用來觸發下一個中間件的前處理,實現了中間件的鏈式調用。
這種設計的優勢是提供了一種類似於遞歸的方式來處理請求,每個中間件只需要關注自己的前處理邏輯,並通過調用 _next(context)
將請求傳遞給下一個中間件。後處理邏輯則是在請求返回時自動執行,無需顯式調用。
這種模式的好處是簡化了中間件的編寫和組合,使得代碼更具可讀性和可維護性。同時,它還提供了一種靈活的方式來插入、移除或重新排序中間件,以滿足不同的需求。
總結起來,Invoke
方法的巧妙設計使得中間件的前處理和後處理邏輯得以統一、簡潔地表達,使得中間件的使用和組合更加方便和優雅。
使用中間件#
與添加依賴服務類似,中間件的配置也有兩種方式:擴展方法、UseMiddleware<T>()
需要注意的是,正如開頭流程圖中顯示,前一個中間件的‘處理’結果是後一個中間件的‘參數’,因此中間件的順序至關重要。
Tip. 注意自定義中間件的位置,當然,這些中間件並不是必須的。
中間件的調用方式,有點像 TCP/IP 協議棧不是嗎。
END.
以下內容來自 AI
在 ASP.NET 中,中間件是一種用於處理 HTTP 請求和響應的機制。它允許你在請求到達目標處理程序之前或響應返回給客戶端之前執行一系列的邏輯處理。中間件可以用於處理路由、認證、日誌記錄、異常處理等各種功能。
其他後端框架和語言也可能採用類似的中間件概念,儘管具體的實現和命名可能有所不同。以下是一些其他後端框架中的類似概念:
- Express.js (Node.js): Express.js 是一個流行的 Node.js 後端框架,它使用中間件來處理請求和響應。你可以通過調用
app.use()
或app.useMiddleware()
來註冊中間件函數,這些函數會按照註冊的順序依次執行。 - Django (Python): Django 是一個 Python 的 Web 框架,它使用中間件(Middleware)來處理請求和響應。你可以通過編寫自定義的中間件類,並將其添加到
MIDDLEWARE
設置中,以在請求處理過程中執行特定的邏輯。 - Ruby on Rails (Ruby): Ruby on Rails 是一個 Ruby 的 Web 框架,它使用中間件來處理請求和響應。你可以通過編寫 Rack 中間件來處理請求,並將其添加到應用的中間件堆棧中。
這些框架中的中間件概念都旨在提供一種靈活和可擴展的方式來處理請求和響應。儘管具體的實現和用法可能有所差異,但它們的目標都是在請求處理過程中提供可組合和可重用的邏輯處理。