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地址
希望以上分享对你有帮助,我是IT人张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注
4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」相关推荐
- asp.net core系列 59 Ocelot 构建基础项目示例
一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...
- NOIP模拟测试14「旋转子段·走格子·柱状图」
旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a ...
- NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- ASP.NET Core 2.0 : 图说管道,唐僧扫塔的故事
本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 ...
- ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事
ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 原文:ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 本文通过一张GIF动图来继续聊一下ASP.NET Core ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求...
之所以称ASP.NET Core是一个Web开发平台,而不是一个单纯的开发框架,源于它具有一个极具扩展性的请求处理管道,我们可以通过对这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET ...
- ASP.NET Core轻松入门之Middleware管道模型
Middleware指的是微软的的asp.net core的管道模型.其原理可以用微软官方的下图展示: 原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方 ...
- 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...
最新文章
- ORA-01555 snapshot too old
- qualcomm memory dump 抓取方法
- velocity 继续之 语法学习篇
- MySQL整理(三)
- sqlserver 分页存储过程
- Docker container与宿主进程相互隔离的实现原理
- webpack打包后引用cdn的js_JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解...
- 手机psp模拟器哪个好_功能强大,手机微信群控系统和云控哪个好?
- jquery 筛选元素 (3)
- 计算机学情分析,中职学生的学情分析 《计算机专业》.doc
- Python3解决modulenotfounderror: no module named‘_bz2‘
- selenium火狐驱动_在Selenium Firefox驱动程序上运行测试
- linux网络配置putty,PuTTY配置详解
- MIDI文件基础及使用Python库mido操作MIDI文件
- php 按钮美化,input(file)按钮样式美化第二种
- xps15u盘装linux,戴尔xps15系统重装图文教程
- 干货 | 关于离岸银行开户(境外开户),看这一篇就够了
- gmail通讯录同步
- SyntaxError :invalid syntax错误解决办法
- 前端工程筹建NodeJs+gulp+bower
热门文章
- 了解这12个概念,让你的JavaScript水平更上一层楼
- 【知云】第六期:数据级异地容灾如何实现?阿里云帮你打通数据的“任督二脉”...
- PHP随机生成中国人姓名的类
- 电子数字 网易游戏在线笔试 第一题 hihocoder
- 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
- Tomcat Server的结构图
- 闲谈: 测试报告的插入图片
- 研究Ajax(二)WebService实现加 减 乘 除
- Android 自定义UI--电池
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信