模拟.net core中间件执行顺序
using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main(string[] args) { App app = new App(); app.Use(next => { Console.WriteLine(1); return act => { Console.WriteLine("1-before"); //其它逻辑代码... Console.WriteLine(act.Url); next.Invoke(act); //其它逻辑代码... Console.WriteLine("1-after"); }; }); app.Use(next => { Console.WriteLine(2); return act => { Console.WriteLine("2-before"); //其它逻辑代码... next.Invoke(act); //其它逻辑代码... Console.WriteLine("2-after"); }; }); app.Use(next => { Console.WriteLine(3); return act => { Console.WriteLine("3-before"); //其它逻辑代码... next.Invoke(act); //其它逻辑代码... Console.WriteLine("3-after"); }; }); HttpContext httpContext = new HttpContext(); Actionact = app.Builder(); act.Invoke(httpContext); Console.ReadLine(); } } public class App { List , Action >> list = new List , Action >>(); public void Use(Func , Action > func) { list.Add(func); } public Action Builder() { //当集合为空时执行,相当于.net core 下的404 Action action = act => { Console.WriteLine("404"); }; list.Reverse(); foreach (Func , Action > item in list) { action = item.Invoke(action); } return action; } } public class HttpContext { public int Id { get; set; } public string Url { get; set; } = "http://www.baidu.com"; public string Host { get; set; } = "www.baidu.com"; } }
执行结果:1->2->3 -> 3->2->1