【3】Asp.Net Core2.2新版管道处理模型
【前言】
上一篇完成了Asp.Net Core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的MVC没啥差别!但这些都是在组件封装的基础上完成的,在Core里面,其实更多的东西是靠订制的,而不是实现固定的,包括管道处理模型!本文将跟大家探讨一下,Asp.Net Core 2.2全新的管道处理模型!
【管道处理模型】
何谓管道处理模型?本质上就是对Http请求的处理过程,在程序中表现为对 HttpContext 的一系列操作,即通过对 Request 的处理,来生成 Reponse,仅此而已。下面给大家一个经典的Asp.Net的处理管道示意图:

Http请求进入到程序时,已经是一个HttpWorkerRequest了,加工成HttpContext,然后交给一个HttpApplication来处理,这里由19个主要的事件构成,覆盖了请求处理的各个步骤,然后基于事件的注册,能够让我们进行灵活的扩展,扩展性非常棒!
然而,在Asp.Net Core里面,却出现了一套更先进的管道流程,让人叹服!下面让Eleven带大家来看看,还能怎么样更先进!
【新管道模型】
还记得那个Startup类里面的那个Configure方法吗?这里就是用来配置HTTP的请求管道的。第一个参数IApplicationBuilder,就是用来构建请求管道的。

这里是个接口,其默认实现类是ApplicationBuilder,是开源的,大家可以自己去下载看的。该类的核心要素有三个:
1 存放middleware容器,private readonly IList<Func<RequestDelegate, RequestDelegate>> _components;
2 我们熟悉的Use方法,_components.Add(middleware),将middleware放进去;
3 Build()方法,在 Hosting 的启动中,最后就是通过该方法创建一个 RequestDelegate 类型的委托来完成整个请求的响应。

步骤梳理如下:
1 定义了一个 404 的RequestDelegate,作为最原始的参数;
2 用Reverse函数将注册的中间件列表进行反转;
3 调用最后注册的那个middleware,结果还是RequestDelegate类型变量;
4 继续倒序调用之前注册的middleware,最终得到一个RequestDelegate。
而RequestDelegate是一个接受HttpContext参数,然后完成一个操作的委托,也就是对Http请求的一个步骤。因为下一个middleware是上一个middleware的参数,让程序可以将整个步骤穿起来,类似于俄罗斯套娃,按我们的注册顺序从里到外,一层套一层。
【Use】
下面来使用Use方法注册3个middleware,来详解一下执行顺序,捋一捋新管道模型是怎么构建的,看看这个神奇的“俄罗斯套娃”!先注册2个常规的middleware:

再注册第三个middleware,这里请注意,没有Invoke那个next:

程序运行的表现是怎么样的呢?
首先在VS的程序输出窗口,你将会看到Middleware 3-2-1的倒序输出,这里的原因刚才解释过了,会倒序调用三个注册的middleware,所以输出顺序是倒过来的!
然后,打开页面的话,将会看到如下顺序:
This is Middleware1 start
This is Middleware2 start
This is Middleware3 start
This is Middleware3 end
This is Middleware2 end
This is Middleware1 end
这个顺序很特别,我来跟大家说道说道。组装完管道模型后,其实我们返回的就是第一个Use里面返回的那个RequestDelegate,然后Http请求来了,Server监听解析得到HttpContext,然后调用这个委托,所以最先执行的是Middleware1 start;
然后Next参数执行了,这个是第二个Use里面返回的那个RequestDelegate(这里不明白的话,再看看前面),于是执行了Middleware2 start;
然后再次执行Next参数,于是执行了Middleware3 start;
然后这里没有执行Next,所以就是Middleware3 end;
这时候第三个中间件动作结束,请求回去第二个中间件继续,于是执行了Middleware2 end;
然后第二个中间件动作结束,请求回去第一个中间件继续,于是执行了Middleware1 end;
这就是全部过程!小伙伴儿们,能看明白吗?这就是个典型的俄罗斯套娃式,再借用个经典的中间件管道模型图给大家。

【结语】
本文清晰的介绍了在Asp.Net Core2.2中的新版管道处理模型,相对于Asp.Net的管道处理模型,灵活度不可同日而语,让人赞叹!在没有Core之前,Asp.Net的管道的扩展性已经非常优异了,但毕竟还是固化了很多环节,在Core这里,完全的自由订制,没有任何局限的扩展空间!学习的时候,在真的懂了的那一刻,情不自禁的为别人的智慧而震撼而雀跃,文章前的小伙伴儿,你有这种感受吗?下一篇文章中,Eleven将带大家去理解花式的中间件注册方式,自定义一些有效的中间件扩展,敬请关注!欢迎关注公众号,欢迎讨论,欢迎转发,愿天下有需求的人都能看到!
作者:Eleven
来源:公众号【软谋net】
想了解更多干货,欢迎关注公众号【程序员在职场】

程序员在职场
【3】Asp.Net Core2.2新版管道处理模型的更多相关文章
- 【4】Asp.Net Core2.2中间件多扩展对应应用
[前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ...
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架
https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具 2.打开VS2017,点击文件-新建-项目,选 ...
- asp.net core2.1认证和授权解密
来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...
- Asp.net MVC进入请求管道的过程
Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...
- ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇]
ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇] 我们知道ASP.NET Web API借助于HttpSelfHostServer以Self Host模式寄宿于当 ...
- 细说Asp.Net Web API消息处理管道(二)
在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...
- 一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...
随机推荐
- 洛谷 P1490 解题报告
P1490 买蛋糕 题目描述 野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕.大家不知道最后要买的蛋 ...
- Java IO流对象、多线程
Input(读) Output(写)操作 File类 import java.io.File; 将操作系统中的文件.目录(文件夹).路径.封装成File对象 提供方法,操作系统中的内容.File与系统 ...
- Visual Studio 201~ Code 格式检查
前言 好的代码格式,有利于阅读和查错,慢慢的有利于养成良好的编码习惯,也可以帮我们找出一些低级错误. StyleCop 在Nuget上搜索stylecop,选择MSBuild的那个版本,安装. 手动编 ...
- PAT1021:Deepest Root
1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph ...
- 第二章:第一个Netty程序
第一步:设置开发环境 • 安装JDK,下载地址http://www.oracle.com/technetwork/java/javase/archive-139210.html • 下载netty ...
- win7 中如何设置eclipse的背景色--Console
http://blog.csdn.net/u013161399/article/details/47297781
- SSM-SpringMVC-22:SpringMVC中转发(forward)和重定向(redirect)
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 转发和重定向大家都熟悉,都学到框架了,怎么能不了解转发和重定向呢? 如果有不熟悉的,可以去百度搜几篇博客去看看 ...
- mac 上安装 nvm 遇到的坑
本人之前在 mac 上已经装过 nvm 了,今天帮朋友在他电脑上装,由于是新版本,没想到有点坑. ** 一定要参考官方文档 一.命令行安装 (图片来自 github ) 意思是,无论你安装还是更新 ...
- Activity的运行过程
今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...
- sql server 高可用故障转移(3)
虚拟磁盘创建 前面我们已经搭了域和两台sql 服务器, 下面我们准备让DC域服务器除了担当域控制器外,还行使另一个职能:充当集群共享存储. 集群共享存储是由群集内的每个节点都能共同访问的一个存储设备, ...