理解ASP.NET Core中的中间件
中間件是ASP.NET Core的一個重要特點,ASP.NET Core應用程序之所以能夠靈活地處理各種各樣的請求,完成都是由于中間件,那么它究竟是怎么一回事呢?
一、理解中間件
ASP.NET Core的一個主要特點是中間件(Middleware),它通過中間件來處理傳入的HTTP請求,并將處理結果返回給發起請求的客戶端。多個中間件構成了中間件管道(Middleware pipeline),也稱為請求管道。之所以稱其為管道,是因為請求能夠從一個中間件進入另一個中間件,并以相反的順序再出來,如下圖。
對于一個ASP.NET Core應用程序,所有向它發送的請求,都是通過它里面添加的中間件來進行處理并返回響應,比如顯示網站的首頁、對用戶的認證、請求靜態文件(CSS、JavaScript文件)等等。
另外,需要注意的是,傳入的請求,不一定會遍歷到所有添加的中間件,有可能在經過某一個中間件處理時,直接返回響應,而不再繼續前進,比如,如果用戶沒有通過認證,或者程序出現異常時,就不會再繼續被下一個中間件處理。
二、Program與Startup
在一個ASP.NET Core應用中,最主要的文件有兩個,一個是Program.cs,另一個是Startup.cs,其中Program.cs里包含了程序的入口,即Program類中的Main函數。而Startup.cs文件中的Startup類則是用來配置當前應用程序。
Startup類包含了兩個方法,即ConfigureServices和Configure,其中前者主要是用于向依賴注入容器添加服務,而后者則是用于為當前程序配置處理HTTP請求的請求管道;在這個方法里,我們可以根據需要添加多個中間件。
public class Startup {public void ConfigureServices(IServiceCollection services){// 向依賴注入容器添加服務}public void Configure(IApplicationBuilder app, IHostingEnvironment env){// 配置中間件管道 } }三、添加中間件
添加中間件的方法有3種,這3種方法都是通過Configure方法的參數IApplicationBuilder接口所提供的方法實現的,這個接口提供Use、Map以及Run方法,均能夠用來添加中間件。
1、Run方法最簡單,它僅處理請求,并不會將請求傳入下一個中間件。因此,對于如下代碼,會直接返回包含一串字符的響應。
app.Run(async (context) =>{ await context.Response.WriteAsync("Hello World!");});2、Use方法與Run方法不同的是,它在處理請求后,還可以把請求傳遞給下一個中間件,并由其繼續處理。
以上代碼的運行結果是:顯示“中間件 A 開始” -> 在響應正文中寫入信息 -> 顯示“中間件A結束。
注意:盡管Use方法能夠讓下一個中間件繼續處理請求,它也可以直接處理,不再繼續向前,在上例中如果訪問/welcome將直接返回響應。
3、Map方法允許指定一個條件,如果請求符合該條件,則會新建一個分支,并在該分支上繼承處理請求,而當請求處理結束后,不返回原來的分支。
當請求/map后,其結果如下:
可以看到,中間件C并未執行。
事實上,除了以上3個方法,ASP.NET Core還提供了UseWhen和MapWhen這兩個方法,它們能夠以更復雜的方式來添加中間件。
通過上面的介紹,我們可以明白兩點,第一,中間件并不復雜,它本質上就是用于處理HTTP請求的一段代碼;第二點,中間件的添加順序很重要,因為它的添加順序將決定應用程序如何處理HTTP請求。
四、自定義中間件
通過上面的方式添加的中間件,我們可以稱為內聯中間件(Inline Middleware),這種方式在實際開發中很少見,更常見的方式是創建自定義中間件類,也即,添加一個類,通過這個類來代表中間件并實現其功能。而這個類需要滿足兩個條件:
第一,它包含一個帶有RequestDelegate類型參數的構造函數,這個RequestDelegate類型的參數表示在請求管道中的下一個中間件;
第二,它包含一個Invoke方法,該方法接受一個HttpContext類型的參數,并且這個方法的返回值為Task,這個HttpContext類型的參數即表示傳入的HTTP請求。以下是一個典型自定義中間件:
當中間件創建好之后,要在Startup類中的Configure方法中把它添加到管道中,只要使用IApplicationBuilder接口的UseMiddleware方法。
ASP.NET Core提供了很多中間件,它們能夠滿足開發Web應用程序時所需要的各種功能,這些中間件包括:MVC、認證、靜態文件、HTTPS重定向、CORS等。以下代碼顯示了一個標準應用程序所添加的中間件。
以上這些以Use開頭的方法均是向請求管道添加相應的中間件。我們可能注意到這些方法并不像我們剛才介紹的添加中間件的方法那樣,即要么使用Use/Map/Run等,要么使用UseMiddleware方法。這里需要說明的是,以上這些以Use開頭的方法本質上也是使用了UseMiddleware方法來添加中間件的。這些方法只不過是通過額外定義的一個擴展方法來更方便地添加相應的中間件而已。我們同樣也可以創建類似的擴展方法,以方便別人使用我們所創建的自定義中間件。
public static class CheckRequestPathMiddlewareExtentions {public static void UseCheckRequestPathMiddleware(this IApplicationBuilder app){app.UseMiddleware<CheckRequestPathMiddleware>();} }通過上面這個方法,我們就可以在Configure方法中直接調用app.UseCheckRequestPathMiddleware方法來添加這個自定義中間件了。
總結
本文簡要地介紹了ASP.NET Core中所引入的中間件的概念以及其使用方法,中間件極大地方便了應用程序對HTTP請求的處理。多個中間件構成的管道為ASP.NET Core應用程序提供了更靈活的、更輕量的HTTP請求處理方式。
總結
以上是生活随笔為你收集整理的理解ASP.NET Core中的中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Core 中间件应用实战
- 下一篇: .NET Core开发实战(第19课:日