.net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道

2018-01-11 19:34:36来源:cnblogs.com作者:ZuQing人点击

分享

    .net Core 2中没有继续沿用以前asp.net中的管道事件,而是开发了一个新的管道(Middleware):

    public class MiddlewareDemo    {        private readonly RequestDelegate _next;        public MiddlewareDemo(RequestDelegate next)        {            _next = next;        }        public Task Invoke(HttpContext httpContext)        {            //可以在此处写一些需要的代码            return _next.Invoke(httpContext);        }    }

 在Startup的Configure方法中用UseMiddleware方法添加到管道中去

  app.UseMiddleware<MiddlewareDemo>();

如果将_next.Invoke(httpContext)改成Task.CompletedTask那么后续添加的Middleware都不会执行了

        public Task Invoke(HttpContext httpContext)        {            return Task.CompletedTask;            //return _next.Invoke(httpContext);        }

通过查看UseMiddleware方法源代码,发现其实际调用的是IApplicationBuilder的Use方法

下面来模拟构建Middleware(RequestDelegate)管道

方便演示我们就创建控制台项目,新建RequestDelegate委托类

public delegate Task RequestDelegate(Context context);
    public class Context    {    }
    class Program    {        static List<Func<RequestDelegate, RequestDelegate>> list = new List<Func<RequestDelegate, RequestDelegate>>();        static void Main(string[] args)        {            Use(next =>            {                return context =>                {                    Console.WriteLine("111");                    return next.Invoke(context);                };            });            Use(next =>            {                return context =>                {                    Console.WriteLine("222");                    return next.Invoke(context);                };            });            Use(next =>            {                return context =>                {                    Console.WriteLine("333");                    return next.Invoke(context);                };            });            Build();            Console.Read();        }        static void Use(Func<RequestDelegate, RequestDelegate> middleware)        {            list.Add(middleware);        }        static void Build()        {            RequestDelegate endReq = (context) =>            {                Console.WriteLine("end");                return Task.CompletedTask;            };            list.Reverse();  //不反转的话最后添加的会先执行            foreach (var middleware in list)            {                endReq = middleware.Invoke(endReq);            }            endReq(new Context());        }    }

运行结果:

如果在某一个Use方法中不执行next.Invoke(context),那么后续使用Use方法添加的都不会执行了,改成如下:

            Use(next =>            {                return context =>                {                    Console.WriteLine("222");                    return Task.CompletedTask;                    //return next.Invoke(context);                };            });

 

总结:

这样的一种模式扩展性比较好,比如一个项目中要使用MVC则写app.UseMvc来添加进去,使用Session,则用app.UseSession()。

Session/Route等都是使用Middleware来实现的

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台