zoukankan      html  css  js  c++  java
  • .net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道

        .net Core中没有继续沿用以前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)管道

    方便演示我们就创建控制台项目,代码如下:

    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是第一个添加到list集合中的Middleware 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/Cros等都是使用Middleware来实现的

  • 相关阅读:
    c# NPOI读取xlsx
    内网搭建代理DNS使用内网域名代替ip地址
    Linux命令行快捷键
    Java基础数组
    Java基础语法
    python3发送邮件的脚本
    Java基础概述
    更多笔记
    Java基础面向对象(一)
    Linux awk抓取IP的两种方式
  • 原文地址:https://www.cnblogs.com/zuqing/p/netcore_Middleware.html
Copyright © 2011-2022 走看看