【4】Asp.Net Core2.2中間件多擴展對應應用
【前言】
上一篇完成了Asp.Net Core 2.2全新的管道處理模型解析,“俄羅斯套娃”式的委托嵌套和傳遞,組建了擴展性無與倫比的管道模型!與此同時,委托嵌套過於復雜,使用起來並不友好,然後多種擴展使用方式出現了,一起來看看吧!
【Run終結式擴展】
IApplicationBuilder裏的Use方法需要一個Func<RequestDelegate, RequestDelegate>的參數,用來嵌套委托並搭建處理鏈條。但有些時候,並不需要這麽麻煩,比如我們需要一個終結點的時候,可以直接使用Microsoft.AspNetCore.Builder裏面的Run擴展。
只需要一個RequestDelegate參數,因為這裏是最後一步處理了,可以如下使用:
這樣配置之後,任何一個Http請求,都將是響應Hello World Run,後面的中間件都無法到達了。通常可以用來做一些終結式請求,比如一些黑名單請求直接終結掉!
【Use串聯式擴展】
如果我們並不想終結請求了,除了默認的實例Use方法,這裏還有個擴展的Use方法,來看看吧。
這裏接受的middleware參數,跟之前的不太一樣了,具體使用如下:
寫成這樣,和之前的差別就是少了一層委托包裝,讓大家更好理解,其實本質上還是利用了RequestDelegate的。這裏運行效果跟之前的Use是一樣的。
【UseWhen條件式擴展】
如果我們還有進一步的要求,希望在請求的過程中做一些判斷過濾,滿足條件的才執行某個中間件,這裏就要用到UseWhen擴展了。
跟命名一樣,就是加個條件判斷後,然後增加對應的中間件,使用如下:
加了這個中間件後,如果Http請求的信息裏面包含了Name,那麽就會多一個響應,如果不包含,就沒有這個中間件了,其他的中間件是不受影響的,很靈活。
【Map地址匹配擴展】
還有時候我們會希望對一些固定URL完成特別處理的,Map擴展可以幫助你!
這裏可以直接對Url進行匹配,然後滿足條件則可以去給IApplicationBuilder再綁定中間件了:
這裏如果請求/Eleven則會終結式響應了。也許有小夥伴兒會問這個不是可以用路由完成嗎?其實這裏是為了在MVC(會有很多步驟)之前,就對一些特別的請求完成處理,提升性能!
【MapWhen 條件式終結擴展】
Map也提供了When的,不僅僅是可以判斷Url了,還可以檢測其他信息。
也是一個條件,一個對IApplicationBuilder的操作為參數,使用如下:
效果跟UseWhen很像,但核心差別在於UseWhen裏面是可以繼續next的,而MapWhen是沒有next的!
【middleware類】
除了上面列出來的多種擴展方式,習慣.NetFramework開發的小夥伴兒,可能更喜歡用類的形式來完成中間件的註冊,這裏也提供了。下面聲明一個middleware類:
這裏既可以實現IMiddleware接口,然後註冊,也可以不用接口約束,但是需要有兩個規範:1 有一個帶RequestDelegate參數的構造函數,擁有保存下一步的動作;2有一個參數為HttpContext的Invoke方法。
然後在前面就可以這樣完成註冊:
效果跟之前的Use一致,在程序啟動時會通過反射來完成middleware類的初始化。
【結語】
本文整理了Asp.Net Core2.2中多種中間件的註冊方式,只能說讓開發變得輕松簡單一些,也給予了更多的想象空間,但是中間件核心本質是沒有變的,請一定不要誤會了。中間件這一塊兒,暫時就告一段落,等後面做一些具體實用的擴展再回來!下一篇文章中,Eleven將帶大家去理解.Net Core中的依賴註入容器了,敬請關註!歡迎關註公眾號,歡迎討論,歡迎轉發,願天下有需求的人都能看到!
作者:Eleven
來源:公眾號【軟謀net】
想了解更多幹貨,歡迎關註公眾號【程序員在職場】
程序員在職場
【4】Asp.Net Core2.2中間件多擴展對應應用