任務29:本身動手構建RequestDelegate管道

 

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);
        }

    }
}
Program.cs

 

 

 

 

 dotnet run 執行

 

執行到1 沒有再往下執行

以上就是整個Http管道的構成過程

相關文章
相關標籤/搜索