<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NET Core中間件的注冊和管道的構(gòu)建(3) ---- 使用Map/MapWhen擴展方法

      .NET Core中間件的注冊和管道的構(gòu)建(3) ---- 使用Map/MapWhen擴展方法

      0x00 為什么需要Map(MapWhen)擴展

      如果業(yè)務邏輯比較簡單的話,一條主管道就夠了,確實用不到Map。不過當業(yè)務邏輯比較復雜的時候,有時候我們可能希望根據(jù)情況的不同使用特殊的一組中間件來處理HttpContext。這種情況下如果只用一條管道,處理起來會非常麻煩和混亂。此時就可以使用Map/MapWhen建立一個分支管道,當條件符合我們的設定時,由這個分支管道來處理HttpContext。使用Map/MapWhen添加分支管道是很容易的,只要提供合適跳轉(zhuǎn)到分支管道的判斷邏輯,以及分支管道的構(gòu)建方法就可以了。

      0x01 Map擴展的原理

      前一篇文章中我們說過,中間件的注冊和管道的構(gòu)建都是通過ApplicationBuilder進行的。因此要構(gòu)建一個分支管道,需要一個新的ApplicationBuilder,并用它來注冊中間件,構(gòu)建管道。為了在分支管道中也能夠共享我們在當前ApplicationBuilder中注冊的服務(或是說共享依賴注入容器,當然共享的并不止這些),在創(chuàng)建新的ApplicationBuilder時并不是直接new一個全新的,而是調(diào)用當前ApplicationBuilder的New方法在當前的基礎上創(chuàng)建新的,共享了當前ApplicationBuilder的Properties(其中包含了依賴注入容器)。

      在使用Map注冊中間件時我們會傳入一個Action<IApplicationBuilder>參數(shù),它的作用就是,當我們創(chuàng)建了新的ApplicationBuilder后,使用這個方法對其進行各種設置,最重要的就是在新的ApplicationBuilder上注冊分支管道的中間件。配置完成后調(diào)用分支ApplicationBuilder的Builder方法構(gòu)建管道,并把第一個中間件保存下來作為分支管道的入口。

      在使用Map注冊中間件時傳入了一個PathString參數(shù),PathString對象我們可以簡單地認為是string。它用于記錄HttpContext.HttpRequest.Path中要匹配的區(qū)段(Segment)。這個字符串參數(shù)結(jié)尾不能是“/”。如果匹配成功則進入分支管道,匹配失則敗繼續(xù)當前管道。

      新構(gòu)建的管道和用于匹配的字符串保存為MapOptions對象,保存了Map規(guī)則和分支管道的入口。之后構(gòu)建MapMiddleware對象,并把它的Invoke方法包裝為RequestDelegate,使用當前ApplicationBuilder的Use方法注冊中間件。

      下面是Map擴展方法:

      下面是MapMiddleware的Invoke方法

      0x02 MapWhen擴展的原理

      Map主要通過URL中的Path來判斷是否需要進入分支管道,但有時候我們很可能會有別的需求,例如我想對所有Method為DELETE的請求用特殊管道處理。這時候就需要用MapWhen了。MapWhen是一種通用的Map,可以由使用者來決定什么時候進入分支管道什么時候不進入。可以說Map是MapWhen的一種情況,因為這種情況太常見了,所以官方實現(xiàn)了一個。這樣看來MapWhen就很簡單了,在Map中我們傳入?yún)?shù)PathString來進行HttpRequest.Path的匹配,在MapWhen中我們傳入Func<HttpContext,bool>參數(shù),有我們自行指定,當返回true時進入分支管道,返回false則繼續(xù)當前管道。

      下面是MapWhen擴展方法:

       

      下面是MapWhenMiddleware的Invoke方法:

      0x03 順便提一下Run擴展

      還有一個注冊中間件的擴展方法是Run,因為非常簡單,所以在最后提一下。Run就是用Use注冊一個中間件,最后不調(diào)用下一個中間件直接返回。所以使用Run擴展方法注冊中間件永遠都是直接返回的,后面的中間件都不會被調(diào)用。

      0x04 寫在最后

      Map/MapWhen和Run都很簡單就不寫測試了。到此為止中間件的注冊和管道的構(gòu)建主題就寫完了。剛開始是出于對中間件有些地方的迷惑開始的,搞明白了后本想著寫一篇博客分享下自己的心得,沒想到越寫越多,一篇分成兩篇,到現(xiàn)在寫了三篇。我這些也只是寫了些大概,很多細節(jié)沒寫到,有興趣的可以去github上看一下代碼,管道和中間件相關的都在這個倉庫:https://github.com/aspnet/HttpAbstractions。

      0x05 相關文章

      .NET Core中間件的注冊和管道的構(gòu)建(1)---- 注冊和構(gòu)建原理

      .NET Core中間件的注冊和管道的構(gòu)建(2)---- 用UseMiddleware擴展方法注冊中間件類

      .NET Core中間件的注冊和管道的構(gòu)建(3) ---- 使用Map/MapWhen擴展方法

       


      更多內(nèi)容歡迎訪問我的博客:http://www.durow.vip

      posted @ 2016-08-09 10:24  durow  閱讀(3494)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 国产精品一区二区三区日韩| 日韩精品一区二区三区中文| 亚洲精品中文字幕一区二| 国产伦一区二区三区久久| 蜜桃视频一区二区三区四| 老熟妇性老熟妇性色| 一区二区在线观看 激情| 2018天天拍拍天天爽视频| 色综合视频一区二区三区| 亚洲成人免费一级av| 国产精品制服丝袜无码| 丰满少妇69激情啪啪无| 欧美丰满熟妇bbbbbb| 国产成人精品成人a在线观看| 女人喷水高潮时的视频网站| 国产AV国片精品有毛| 亚洲无?码A片在线观看| 欧美色欧美亚洲高清在线视频| 任你躁国产自任一区二区三区| 狠狠躁夜夜躁人人爽蜜桃| 久久97超碰色中文字幕| 国产稚嫩高中生呻吟激情在线视频| 黄瓜视频在线观看| 国产成人精品亚洲一区二区| 国产成AV人片久青草影院| a级黑人大硬长爽猛出猛进| 亚洲欧美人成人让影院| 无套中出极品少妇白浆| 久久精品国产99精品亚洲| 亚洲男人第一无码av网站| 国产午夜精品福利免费不| 人人玩人人添人人澡超碰| 久久精品人人槡人妻人人玩av| 国产一区二区高清不卡| 中国大陆高清aⅴ毛片| 高清免费毛片| 国产午夜亚洲精品一区| 福利一区二区在线视频| 国产精品综合色区av| 亚洲AⅤ天堂AV天堂无码| 国产99视频精品免费视频36|