【前言】 上一篇完成了Asp.Net Core 2.2項目的一個最簡單功能的添加,從控制器-視圖-實體輕鬆交互了一下,感覺跟之前的MVC沒啥差別!但這些都是在組件封裝的基礎上完成的,在Core裡面,其實更多的東西是靠訂製的,而不是實現固定的,包括管道處理模型!本文將跟大家探討一下,Asp.Net C ...
【前言】
上一篇完成了Asp.Net Core 2.2項目的一個最簡單功能的添加,從控制器-視圖-實體輕鬆交互了一下,感覺跟之前的MVC沒啥差別!但這些都是在組件封裝的基礎上完成的,在Core裡面,其實更多的東西是靠訂製的,而不是實現固定的,包括管道處理模型!本文將跟大家探討一下,Asp.Net Core 2.2全新的管道處理模型!
【管道處理模型】
何謂管道處理模型?本質上就是對Http請求的處理過程,在程式中表現為對 HttpContext 的一系列操作,即通過對 Request 的處理,來生成 Reponse,僅此而已。下麵給大家一個經典的Asp.Net的處理管道示意圖:
Http請求進入到程式時,已經是一個HttpWorkerRequest了,加工成HttpContext,然後交給一個HttpApplication來處理,這裡由19個主要的事件構成,覆蓋了請求處理的各個步驟,然後基於事件的註冊,能夠讓我們進行靈活的擴展,擴展性非常棒!
然而,在Asp.Net Core裡面,卻出現了一套更先進的管道流程,讓人嘆服!下麵讓Eleven帶大家來看看,還能怎麼樣更先進!
【新管道模型】
還記得那個Startup類裡面的那個Configure方法嗎?這裡就是用來配置HTTP的請求管道的。第一個參數IApplicationBuilder,就是用來構建請求管道的。
這裡是個介面,其預設實現類是ApplicationBuilder,是開源的,大家可以自己去下載看的。該類的核心要素有三個:
1 存放middleware容器,private readonly IList<Func<RequestDelegate, RequestDelegate>> _components;
2 我們熟悉的Use方法,_components.Add(middleware),將middleware放進去;
3 Build()方法,在 Hosting 的啟動中,最後就是通過該方法創建一個 RequestDelegate 類型的委托來完成整個請求的響應。
步驟梳理如下:
1 定義了一個 404 的RequestDelegate,作為最原始的參數;
2 用Reverse函數將註冊的中間件列表進行反轉;
3 調用最後註冊的那個middleware,結果還是RequestDelegate類型變數;
4 繼續倒序調用之前註冊的middleware,最終得到一個RequestDelegate。
而RequestDelegate是一個接受HttpContext參數,然後完成一個操作的委托,也就是對Http請求的一個步驟。因為下一個middleware是上一個middleware的參數,讓程式可以將整個步驟穿起來,類似於俄羅斯套娃,按我們的註冊順序從裡到外,一層套一層。
【Use】
下麵來使用Use方法註冊3個middleware,來詳解一下執行順序,捋一捋新管道模型是怎麼構建的,看看這個神奇的“俄羅斯套娃”!先註冊2個常規的middleware:
再註冊第三個middleware,這裡請註意,沒有Invoke那個next:
程式運行的表現是怎麼樣的呢?
首先在VS的程式輸出視窗,你將會看到Middleware 3-2-1的倒序輸出,這裡的原因剛纔解釋過了,會倒序調用三個註冊的middleware,所以輸出順序是倒過來的!
然後,打開頁面的話,將會看到如下順序:
This is Middleware1 start
This is Middleware2 start
This is Middleware3 start
This is Middleware3 end
This is Middleware2 end
This is Middleware1 end
這個順序很特別,我來跟大家說道說道。組裝完管道模型後,其實我們返回的就是第一個Use裡面返回的那個RequestDelegate,然後Http請求來了,Server監聽解析得到HttpContext,然後調用這個委托,所以最先執行的是Middleware1 start;
然後Next參數執行了,這個是第二個Use裡面返回的那個RequestDelegate(這裡不明白的話,再看看前面),於是執行了Middleware2 start;
然後再次執行Next參數,於是執行了Middleware3 start;
然後這裡沒有執行Next,所以就是Middleware3 end;
這時候第三個中間件動作結束,請求回去第二個中間件繼續,於是執行了Middleware2 end;
然後第二個中間件動作結束,請求回去第一個中間件繼續,於是執行了Middleware1 end;
這就是全部過程!小伙伴兒們,能看明白嗎?這就是個典型的俄羅斯套娃式,再借用個經典的中間件管道模型圖給大家。
【結語】
本文清晰的介紹了在Asp.Net Core2.2中的新版管道處理模型,相對於Asp.Net的管道處理模型,靈活度不可同日而語,讓人贊嘆!在沒有Core之前,Asp.Net的管道的擴展性已經非常優異了,但畢竟還是固化了很多環節,在Core這裡,完全的自由訂製,沒有任何局限的擴展空間!學習的時候,在真的懂了的那一刻,情不自禁的為別人的智慧而震撼而雀躍,文章前的小伙伴兒,你有這種感受嗎?下一篇文章中,Eleven將帶大家去理解花式的中間件註冊方式,自定義一些有效的中間件擴展,敬請關註!歡迎關註公眾號,歡迎討論,歡迎轉發,願天下有需求的人都能看到!
作者:Eleven
來源:公眾號【軟謀net】
想瞭解更多乾貨,歡迎關註公眾號【程式員在職場】
程式員在職場