middleware 管道介绍

时间 2018/4/3 20:28:55 加载中...

考试的时候,你坐在最后一排,一个学霸坐在了第一排,学霸把纸条从第一排往后给你传,传了5个人,传到你的手上了。


这里的纸条相当于Request,第一个截获请求,经他手之后,才会传到第二人手上,这个决定权是在前面的人手上的。

前面人不传递了,那么请求就到此结束了。


这里中间经过的每一个人都可以认为是一个“Middleware”


我们通过 IApplicationBuilder 的扩展方法来添加一个管道


public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware);


我们从定义中可以看到,这个 middleware 其实就是一个方法。


这个方法呢,传入的参数有两个,HttpContext,Func<Task>

Func<Task> 又是一个方法,即后面要调用的方法,我们可以认为是传递纸条中的下一个人。

返回的结果是一个 Task


public Task  Method(HttpContext context, Func<Task> task){

}


管道的添加是在 Startup 文件中的 Configure 方法中,如下:


app.Use((context, next) =>
{
    context.Response.WriteAsync("a");
    return next.Invoke();
});

app.Use((context, next) =>
{
    context.Response.WriteAsync("b");
    return next.Invoke();
});



另一种添加管道的方法:


IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)

//RequestDelegate 的定义 
public delegate Task RequestDelegate(HttpContext context)
public delegate TResult Func<in T, out TResult>(T arg)
namespace ConsoleApp2
{
    class Program
    {
        private static List<Func<PapgerDelegate, PapgerDelegate>> list = new List<Func<PapgerDelegate, PapgerDelegate>>();

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            Add(next =>
            {
                return (p) =>
                {
                    p.Content += "person1 \r\n";
                    next.Invoke(p);
                };
            });

            Add(next =>
            {
                return (p) =>
                {
                    p.Content += "person2 \r\n";
                    next.Invoke(p);
                };
            });


            PapgerDelegate del = Build();

            var model = new Papger();
            del(model);

            Console.WriteLine(model.Content);
        }

        static void Add(Func<PapgerDelegate, PapgerDelegate> pipeline)
        {
            list.Add(pipeline);
        }

        static PapgerDelegate Build()
        {
            PapgerDelegate end = p =>
            {
                p.Content += "end\r\n";
            };

            foreach (var func in list)
            {
                end = func.Invoke(end);
            }

            return end;
        }
    }

    public class Papger
    {
        public string Content { get; set; }
    }

    public delegate void PapgerDelegate(Papger pager);
}


扫码分享
版权说明
作者:SQBER
文章来源:http://blog.sqber.com/articles/net-core-middleware.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。