任务29:自己动手构建RequestDelegate管道
cmd创建一个控制台应用程序
dotnet new console --name MyPipeline
用VSCode打开这个项目
新建类RequestDelegate.cs的类文件复制Program里面的代码到RequestDelegate里面代码修改
引入命名空间。
创建一个delegaet 叫做 RequestDelegate
为了演示用,新建一个Context.cs
完善RequestDelegate
新建一个List接收一个RequestDelegate返回一个Delegate
public static List<Func<RequestDelegate,RequestDelegate>> _list=new List<Func<RequestDelegate, RequestDelegate>>();
模拟我们的ApplicationBuilder里面的方法新建Use的方法,接受一个Func里面接受一个RequestDelegate返回一个RequestDelegate
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管道的构成过程