ASP.NET Core 中的中間件(Middleware)
在這個節中,我們將了解,ASP.NET Core 中的中間件是 什么?中間件很重要,尤其是在你想當架構師這一條路上。
ASP.NET Core 中的中間件是 什么?
在 ASP.NET Core 中,中間件(Middleware)是一個可以處理 HTTP 請求或響應的軟件管道。 ASP.NET Core 中給中間件組件的定位是具有非常特定的用途。例如,我們可能有需要一個中間件組件驗證用戶,另一個中間件來處理錯誤,另一個中間件來提供靜態文件,如 JavaScript 文件,CSS 文件,圖片等等。
我們使用這些中間件組件在 ASP.NET Core 中設置請求處理管道。而正式這管道決定了如何處理請求。 而請求管道是由Startup.cs文件中的Configure()方法進行配置,它也是應用程序啟動的一個重要部分。 以下是Configure()方法中的代碼。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
如您所見, 由空項目模板生成的Configure()方法中的代碼中,一個非常簡單的請求處理管道中,只有兩個中間件。
UseDeveloperExceptionPage是一個中間件,第二個中間件是使用Run()方法設置的。 現在,通過這個非常簡單的請求處理管道,我們所有的應用程序都可以將消息寫入,然后在由瀏覽器顯示出來。
我們將在下一個視頻中詳細介紹此方法中的代碼。
現在讓我們了解什么是中間件以及它在 asp.net Core 中的工作原理。
下圖幫助我們了解中間件組件以及它們如何適應請求處理管道

在 ASP.NET Core 中,中間件組件可以同時訪問 - 傳入請求和傳出響應。 因此,中間件組件可以處理傳入請求並將該請求,傳遞給管道中的下一個中間件以進行進一步處理。 例如,如果您有一個日志記錄中間件,它可能只是記錄請求的時間,它處理完畢后將請求傳遞給下一個中間件以進行進一步處理。
中間件組件可以處理請求, 並決定不調用管道中的下一個中間件,從而使管道短路,官方微軟給了一個英文的名字叫“terminal middleware ”,翻譯為“終端中間件”。短路通常是被允許的,因為它可以避免一些不必要的工作。 例如, 如果請求的是像圖像或 css 文件這樣的靜態文件, 則 StaticFiles 中間件可以處理和服務該請求並使管道中的其余部分短路。這個意思就是說,在我們的示例中, 如果請求是針對靜態文件, 則 Staticile 中間件不會調用 MVC 中間件,避免一些無謂的操作。
**中間件組件可以通過傳入的 HTTP 請求來響應 HTTP 請求。**例如,管道中的mvcmiddleware處理對URL /students的請求並返回學生列表信息。 隨着我們在本課程中的進展,在我們即將推出的視頻中,我們將演示mvcmiddleware在管道中如何進行請求和響應的。
中間件組件還可以處理傳出響應。例如,日志記錄中間件組件可以記錄響應發送的時間。此外,它還可以通過計算接收請求和響應發送時間之間的差異來計算處理請求所花費的所有時間。
如果你使用過 ABP 框架,它的審計日志功能是怎么設計的,是否有了一些提示呢。
中間件組件是按照添加到管道的順序進行執行的。所以我們要注意以正確的順序添加中間件,否則應用程序可能無法按預期運行,哪怕編譯成功,但是程序還是會出錯。
在我們即將發布的視頻中,我們將通過一個示例,討論如果中間件組件未按正確順序添加到處理管道中會發生什么。
中間件組件應該用 NuGet 包的形式提供。由 NuGet 處理更新,盡量將中間件拆的足夠小,提供每個中間件獨立更新的能力。
ABPVNext 就是這樣設計的,同樣,很多人吼的微服務就是在干這個事情,另外變向說明了,我們很多的架構組就是在開發中間件而已。這些只是我的吐槽,如果你不懂 ABP 和 ABPVnext,也不要緊。以后慢慢學。
根據您的程序要求,您可以向請求處理管道添加盡可能多的中間件組件。例如,如果您正在使用一些靜態 HTML 頁面和圖像,開發簡單的 Web 應用程序,那么您的請求處理管道可能只包含“StaticFiles”中間件。 這個就是模塊化設計帶來的好處,讓每個人都像玩積木一樣。 另一方面,如果您正在開發一個安全的數據驅動設計的 Web 應用程序,那么您可能需要幾個中間件組件,如 StaticFiles 中間件,身份驗證中間件,授權中間件,MVC 中間件等。 數據驅動設計,可以簡單理解為復雜項目。
我想指出的是,系統是你的,你是系統的架構師, 您可以完全控制請求,處理管道中的配置。這也意味着, 從內存和性能的角度來看, 您只需為請求處理管道中的中間件組件支付流量費和服務器開支就好了。
現在我們已經基本了解了什么是中間件組件以及它們如何適應請求處理管道,在下一個視頻中,我們將了解如何使用中間件組件為我們的 ASP.NET Core 應用程序配置請求處理管道。
所以你看當一個架構師,玩好中間件就可以了。戲言而已,不必當真。。。
歡迎添加個人微信號:Like若所思。
歡迎關注我的公眾號,不僅為你推薦最新的博文,還有更多驚喜和資源在等着你!一起學習共同進步!

