1. 程式人生 > >【4】Asp.Net Core2.2中間件多擴展對應應用

【4】Asp.Net Core2.2中間件多擴展對應應用

text mic 之前 nbsp 成了 配置 cor 形式 固定

【前言】

上一篇完成了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中間件多擴展對應應用