原文: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系列」相关推荐

  1. asp.net core系列 59 Ocelot 构建基础项目示例

    一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...

  2. NOIP模拟测试14「旋转子段·走格子·柱状图」

    旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a ...

  3. NOIP模拟测试13「矩阵游戏·跳房子·优美序列」

    矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...

  4. NOIP模拟测试5「星际旅行·砍树·超级树」

    星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...

  5. ASP.NET Core 2.0 : 图说管道,唐僧扫塔的故事

    本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 ...

  6. ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事

    ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 原文:ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 本文通过一张GIF动图来继续聊一下ASP.NET Core ...

  7. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求...

    之所以称ASP.NET Core是一个Web开发平台,而不是一个单纯的开发框架,源于它具有一个极具扩展性的请求处理管道,我们可以通过对这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET ...

  8. ASP.NET Core轻松入门之Middleware管道模型

    Middleware指的是微软的的asp.net core的管道模型.其原理可以用微软官方的下图展示: 原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方 ...

  9. 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

    前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...

最新文章

  1. ORA-01555 snapshot too old
  2. qualcomm memory dump 抓取方法
  3. velocity 继续之 语法学习篇
  4. MySQL整理(三)
  5. sqlserver 分页存储过程
  6. Docker container与宿主进程相互隔离的实现原理
  7. webpack打包后引用cdn的js_JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解...
  8. 手机psp模拟器哪个好_功能强大,手机微信群控系统和云控哪个好?
  9. jquery 筛选元素 (3)
  10. 计算机学情分析,中职学生的学情分析 《计算机专业》.doc
  11. Python3解决modulenotfounderror: no module named‘_bz2‘
  12. selenium火狐驱动_在Selenium Firefox驱动程序上运行测试
  13. linux网络配置putty,PuTTY配置详解
  14. MIDI文件基础及使用Python库mido操作MIDI文件
  15. php 按钮美化,input(file)按钮样式美化第二种
  16. xps15u盘装linux,戴尔xps15系统重装图文教程
  17. 干货 | 关于离岸银行开户(境外开户),看这一篇就够了
  18. gmail通讯录同步
  19. SyntaxError :invalid syntax错误解决办法
  20. 前端工程筹建NodeJs+gulp+bower

热门文章

  1. 了解这12个概念,让你的JavaScript水平更上一层楼
  2. 【知云】第六期:数据级异地容灾如何实现?阿里云帮你打通数据的“任督二脉”...
  3. PHP随机生成中国人姓名的类
  4. 电子数字 网易游戏在线笔试 第一题 hihocoder
  5. 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
  6. Tomcat Server的结构图
  7. 闲谈: 测试报告的插入图片
  8. 研究Ajax(二)WebService实现加 减 乘 除
  9. Android 自定义UI--电池
  10. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信