.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來實現的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM