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

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

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

      .NET Core基礎:白話管道中間件

      Asp.Net Core中,管道往往伴隨著請求一起出現。客戶端發起Http請求,服務端去響應這個請求,之間的過程都在管道內進行。

      舉一個生活中比較常見的例子:旅游景區。

      我們都知道,有些景區大門離景區很遠,我們需要經過層層關卡才能到達景區。

      我的請求最終就是去到景區,去到景區的整個過程就是管道,景區就是服務器,層層關卡就是一個個中間件了,比如:門票停車費擺渡費等等。

      如果其中任何一個中間件卡殼了,比如我沒買門票,那別人肯定是不讓我進去,這就是管道短路了。


      Asp.Net Core 請求管道包含一系列Http請求委托(RequestDelegate),依次調用。

      微軟給的圖示:

       

       

      .Net Core服務

      在解釋管道的使用方法之前,我們先來準備一個Asp.Net Core服務。

      創建一個.Net Core控制臺應用程序,并實現如下代碼,一個簡單的使用 Kestrel 托管的服務就完成了:


      internal class Program{ static void Main(string[] args) { new WebHostBuilder() .UseKestrel() .UseStartup<Startup2>() .Build() .Start();
      Console.ReadLine(); }}public class Startup{ public void Configure(IApplicationBuilder app) { }}

       

       

       

      這也是.Net Core的優點之一,只選擇我們需要的,摒棄那些多余的功能。優點是優點,一般開發中也犯不上這樣去做。

      Kestrel 托管默認監聽端口:5000

      管道中間件

      微軟這邊內置了三個擴展函數供我們構建自己的中間件:

      1. Use

      2. Map

      3. Run

      其中UseMap函數還提供了對應的分支擴展:UseWhenMapWhenUseMiddleware。下面我們一個個來解釋。

      app.Use

      Use 是最常用的一種模式,承接上一個請求并執行下一個請求的任務


      public void Configure(IApplicationBuilder app){ app.Use(async (context, next) => { Console.WriteLine("middleware1"); await next.Invoke(); }); app.Use(async (context, next) => { Console.WriteLine("middleware2"); });}

       

      app.UseWhen

      UseWhenUse的基礎上提供了條件分支的功能


      app.UseWhen(context => // 判斷請求路徑的開頭是否是/h context.Request.Path.StartsWithSegments(new PathString("/h")), c => c.Use(async (context, next) => { Console.WriteLine("middleware1"); await next.Invoke(); }));app.Use(async (context, next) =>{ Console.WriteLine("middleware2");});

       

       

       

       

       

      app.Map

      Map我們可以理解成專為請求路徑擴展的分支中間件,可以根據請求路徑去處理對應分支邏輯,與上面的UseWhen例子效果類似,但更加方便。


      app.Map("/h", _app =>{ _app.Use(async (context, next) => { Console.WriteLine("hello world"); });});

      app.MapWhen

      MapWhenUseWhen類似,都是在請求上下文的基礎上去擴展分支,比Map更加靈活。

      app.MapWhen(context => { return context.Request.Query["name"] == "tony"; }, _app => {    _app.Use(async (context, next) => {        context.Response.ContentType = "text/plain; charset=utf-8";        await context.Response.WriteAsync("i 服了 you");    });});

      app.Run

      Run一般用于斷路或請求管道的末尾,不會將請求傳遞下去

      app.Run(async context =>
      {
      await context.Response.WriteAsync("hello world");
      });

      UseMiddleware

      將一個完整的類添加到管道中間件,也就是將上面的請求委托,用類以及函數的形式替代了,便于我們的代碼管理。

      app.UseMiddleware<DotnetboyMiddleware>();
      public class DotnetboyMiddleware{ private readonly RequestDelegate _next; private readonly string _name; public DotnetboyMiddleware(RequestDelegate next, string name) { _next = next; _name = name; } public Task Invoke(HttpContext context) { context.Response.WriteAsync($"my name is {_name}").Wait(); return this._next(context); }}

      微軟內置的一些管道中間件擴展函數就介紹完了,下面我們實現一下微軟實例圖示中的效果:

      public void Configure(IApplicationBuilder app){    app.Use(async (context, next) =>    {        Console.WriteLine("middleware1 : in");        await next.Invoke();        Console.WriteLine("middleware1 : out");    });    app.Use(async (context, next) =>    {        Console.WriteLine("middleware2 : in");        await next.Invoke();        Console.WriteLine("middleware2 : out");    });    app.Run(async context =>    {        Console.WriteLine("Hello World");        await context.Response.WriteAsync("Hello World");    });}

       

       

       

       

      從上面的例子中我們可以看到,中間件都是由上而下依次執行,由每個中間件決定是否繼續執行下一個中間件,最終到響應結果。

      如果哪個中間件決定不往下執行,那通道也就短路了,比如我們去掉 middleware2 的 await next.Invoke();

      執行到 Console.WriteLine("middleware2 : out"); 就短路了,此路不通,原路返回。

       

       

      因為管道中間件執行邏輯的關系,我們在實際開發中要注意兩點:

      • 1、謹慎使用管道短路

      • 2、注意中間件的使用順序,比如:路由中間件肯定是要在認證中間件前面執行,有中間件需要訪問文件,在此之前就必須先執行開放靜態文件的中間件

      posted @ 2022-12-28 20:56  春光牛牛  閱讀(198)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 称多县| 久久天堂无码av网站| 毛片内射久久久一区| 999国产精品999久久久久久| 青青草原网站在线观看| 91福利视频一区二区| 欧美日本精品一本二本三区| 四虎永久免费很黄的视频| 亚洲国产精品一区二区第一页| 国产精品亚洲二区亚瑟| 午夜成人无码福利免费视频| 国产亚洲综合区成人国产| 久久综合亚洲色一区二区三区| 无码人妻久久久一区二区三区| 亚洲AV无码东方伊甸园| 亚洲午夜伦费影视在线观看| 黄又色又污又爽又高潮| 精品一区二区中文字幕| 2019国产精品青青草原| 婷婷五月综合激情| 久久精品夜夜夜夜夜久久| 亚洲色偷偷色噜噜狠狠99| 亚洲AVAV天堂AV在线网阿V| 欧美精品国产综合久久| 久久人人爽人人爽人人av| 无码国产偷倩在线播放| 国产国产久热这里只有精品| 日韩欧美在线综合网另类| 成人福利国产午夜AV免费不卡在线| 午夜福利国产区在线观看| 中文字幕av日韩有码| 综合激情亚洲丁香社区| 日韩在线一区二区每天更新| 中国农村真卖bbwbbw| 日韩中文字幕v亚洲中文字幕| 中日韩黄色基地一二三区| 韩国三级+mp4| 日韩一本不卡一区二区三区| 在国产线视频A在线视频| 亚洲精品乱码久久久久红杏| 国产一区二区不卡精品视频|