4.4管道和中間件介紹「深刻淺出ASP.NET Core系列」

但願給你3-5分鐘的碎片化學習,多是坐地鐵、等公交,聚沙成塔,水滴石穿,謝謝關注。html

管道流

  咱們知道一個管道能夠有一個或多箇中間件,而中間件的職責是根據HttpContext處理HTTP請求,而後往Response裏填充東西,最後完成整個Response的輸出。瞭解管道流機制,就能知道如何利用管道進行攔截,自定義封裝中間件等高級操做,因此學習管道流機制對咱們編碼有質的提升。那麼管道數據是如何流通的呢?以下圖所示,Request進入Middleware 1,疊加一層邏輯代碼到HttpContext(切確說是HttpContext的Response對象),而後調用next()進入到下一個Middleware 2,依次遞推,最後全部的邏輯代碼疊加完畢後返回前端。前端

管道實踐

  IApplicationBuilder構建管道有兩種方法,分別是Use和Run方法,他們的區別在下面會談到。app

app.Use方法

  這裏先了解Use方法的第一個重載,以下圖所示,他是一個類型爲委託的中間件(middleware)。async

  這個中間件同時攜帶一個next的RequestDelegate委託,能夠實現調用下一個管道中間件,咱們看下代碼實踐,以下所示,context從當前管道進來,處理後,經過next.Invoke()轉移到下一個管道,完成一個管道的生命週期。ide

   其實我更喜歡截圖,由於能夠任意打標註,可是不方便拷貝,因此一塊兒貼上代碼吧。學習

app.Use(async (context, next) =>
{
     await context.Response.WriteAsync("fisrt……");
     await next.Invoke();
});

  以上的用法,若是是新手可能不知其因此然,用沒問題,可是內部是如何實現的?不知道!其實這裏使用到了語言的高級特性委託,經過委託實現了開閉原則,也就是把管道的擴展開放出來,咱們可使用規定的app.Use方法,可是內部定義的委託參數類型,好比context,Fun<task>則對外屏蔽了實現。因此你看到的next.Invoke()已經封裝了具體的實現了,對於使用者,其實能夠不用去管那麼多,拿來用便可。ui

  app.Use還有另一個重載,以下圖提示:這裏Func傳入一個RequestDelegate,返回一個RequestDelegate。不一樣於第一個重載,他沒有next.Invoke()的調用,而是之間返回一個RequestDelegate給app進行處理。編碼

    咱們看下代碼實現,外層紅色框是傳入的管道,內部綠色框是返回的管道。spa

 app.Run

app.Run和app.Use不一樣之處在於,app.Use能夠調用下一個管道中間件,app.Run不會,咱們演示一段代碼。code

    app.Use(async (context, next) =>
    {
        await context.Response.WriteAsync("<html><body>");
        await context.Response.WriteAsync("<div>Inside middleware defined using app.Use</div>");
        await next();
        await context.Response.WriteAsync("</body></html>");
    });
 
    app.Run(async context => { 
       await context.Response.WriteAsync("<div>Inside middleware defined using app.Run</div>"); 
    });
 
   //該管道會不會被打印呢? app.Use(
async (context, next) => { await context.Response.WriteAsync("<html><body>"); await context.Response.WriteAsync("<div>Another Middleware defined using app.Use</div>"); await next(); await context.Response.WriteAsync("</body></html>"); });

以下圖所示,咱們看到Run後面定義的第二個Use沒有打印出來,這是由於Run不會調用隨後的管道中間件致使的,因此咱們通常習管性把Run方法放在全部管道中間件的最後。 

 但願以上分享對你有幫助,我是IT人張飛洪,入行10年有餘,人不堪其憂,吾不改其樂,謝謝您關注

相關文章
相關標籤/搜索