cmd建立一個控制檯應用程序ide
dotnet new console --name MyPipelineui
用VSCode打開這個項目spa
新建類RequestDelegate.cs的類文件複製Program裏面的代碼到RequestDelegate裏面代碼修改3d
引入命名空間。code
建立一個delegaet 叫作 RequestDelegateorm
爲了演示用,新建一個Context.csblog
完善RequestDelegateip
新建一個List接收一個RequestDelegate返回一個Delegatecmd
public static List<Func<RequestDelegate,RequestDelegate>> _list=new List<Func<RequestDelegate, RequestDelegate>>();
模擬咱們的ApplicationBuilder裏面的方法新建Use的方法,接受一個Func裏面接受一個RequestDelegate返回一個RequestDelegatestring
public static void Use(Func<RequestDelegate, RequestDelegate> middleware) { _list.Add(middleware); }
using System; using System.Collections.Generic; using System.Threading.Tasks; namespace MyPipeline { class Program { public static List<Func<RequestDelegate,RequestDelegate>> _list=new List<Func<RequestDelegate, RequestDelegate>>(); static void Main(string[] args) { Use(next=>{ return context=>{ Console.WriteLine("1"); return next.Invoke(context); //return Task.CompletedTask; }; }); Use(next=>{ return context=>{ Console.WriteLine("2"); return next.Invoke(context); }; }); RequestDelegate end= (context)=>{ Console.WriteLine("end....."); return Task.CompletedTask; }; _list.Reverse();//順序反轉 foreach(var middleware in _list) { end=middleware.Invoke(end); } end.Invoke(new Context()); Console.ReadLine(); } public static void Use(Func<RequestDelegate, RequestDelegate> middleware) { _list.Add(middleware); } } }
dotnet run 執行
執行到1 沒有再往下執行
以上就是整個Http管道的構成過程