4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。
管道实现机制
要了解管道的实现机制,我们必须要深入框架的源码,幸亏微软开源了,我们可以访问GitHub的地址来下载源码。
git clone后,我们打开工程,进入Microsoft.AspNetCore.Http项目搜索ApplicationBuilder类(如下图),RequestDelegate是中间件的核心,而ApplicationBuilder是接收多个RequestDelegate的集合,所以解析ApplicationBuilder是了解整个管道实现的重要内容。而ApplicationBuilder里有两个重要的方法Build和Use也是我们关注的焦点。
Use方法
我们看下Use方法的参数是一个委托,该委托接收一个RequestDelegate参数,返回一个RequestDelegate,而_components.Add(middleware);是什么呢?我们看下这个全局变量的定义:
_components就是一个IList列表容器,也就是说Use方法做的事情非常简单,就是不断的把中间件middleware往容器里面加而已,而中间件是什么?就是一个由RequestDelegate构成的委托罢了。
我们知道Use还有一个重载方法,他是一个扩展方法,可以在UseExtensions找到(如下图),这个扩展方法其实也是调用上面的Use方法,往容器添加内容。
包括Run方法和上面类似,都是往容器灌入Middleware中间件。
Build方法
Use完了之后,接下来做什么呢?我们看下Build实现代码。
这里对RequestDelegate集合进行反转,然后逐一调用执行,所以app会被最后一个执行。最后只返回一个RequestDelegate
模拟构建管道
接下来,我们来模拟管道的构建过程,我们先建两个类,一个是RequestDelegate.cs和HttpContext.cs。
HttpContext.cs我们假设没有任何实现:
RequestDelegate.cs定义一个委托
因为是模拟,所以我们这里使用控制台来测试,dotnet new console --name iConsole
我们在Program.cs实现核心代码如下:
using System; using System.Collections.Generic; using System.Threading.Tasks; namespace iConsole { class Program { private static readonly IList<Func<RequestDelegate, RequestDelegate>> _mycomponents = new List<Func<RequestDelegate, RequestDelegate>>(); static void Main(string[] args) { //以下是Lambada表达式的简写 Use(next => { return context => { Console.WriteLine("PipeLine 1……"); return next.Invoke(context); }; }); Use(next => { return context => { Console.WriteLine("PipeLine 2……"); return next.Invoke(context); }; }); RequestDelegate PipeLine_end = context => { Console.WriteLine("PipeLine_end……"); return Task.CompletedTask; }; foreach (var component in _mycomponents) { PipeLine_end = component(PipeLine_end); } PipeLine_end.Invoke(new HttpContext()); Console.ReadLine(); } public static void Use(Func<RequestDelegate,RequestDelegate> middleware) { _mycomponents.Add(middleware); } } }
dotnet run后效果如下,整个模拟过程结束,是不是很简单呢。
以上代码大部分是截图,截图看起来更加顺眼,虽然不方便复制,如果你想看完整代码可以访问我的GitHub地址
- 4.4管道Middleware简介「深入浅出ASP.NET Core系列」
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
- 2.3Options建立配置和实体的映射「深入浅出ASP.NET Core系列」
- yoeman构建Asp.net core项目并且实现分层
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
- 1.6部署到CentOS「深入浅出ASP.NET Core系列」
- 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制
- 菜鸟入门【ASP.NET Core】8:Middleware管道介绍、自己动手构建RequestDelegate管道
- 2.4配置的热更新「深入浅出ASP.NET Core系列」
- 2.5配置的框架浅析「深入浅出ASP.NET Core系列」
- 2.4配置的热更新「深入浅出ASP.NET Core系列」
- 3.1依赖注入「深入浅出ASP.NET Core系列」
- 在Mac上开发使用yoeman构建Asp.net core项目并且实现分层引用
- 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?
- 深入浅出ASP.NET Core系列(入门篇)
- 2.2Bind建立配置文件和实体的映射「深入浅出ASP.NET Core系列」
- 1.1专题介绍「深入浅出ASP.NET Core系列」
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页
- 1.2环境安装「深入浅出ASP.NET Core系列」
- 用.Net Core控制台模拟一个ASP.Net Core的管道模型