【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的用法 ...
随机推荐
- python爬虫入门(一)urllib和urllib2
爬虫简介 什么是爬虫? 爬虫:就是抓取网页数据的程序. HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的 ...
- python奇技淫巧——max/min函数的用法
本文以max()为例,对min/max内建函数进行说明 源码 def max(*args, key=None): # known special case of max ""&qu ...
- Flask信号和wtforms
一.信号 1.1.所有内置信号 request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _s ...
- ubuntu18.04安装搜狗拼音
1.下载好搜狗安装包http://pinyin.sogou.com/linux/ ,注意位数! 2.打开终端安装依赖 sudo apt install libfcitx-qt0 3.提取下载好的 ...
- 实验效果展示(会声会影+FSCapture)
第一步,视频录制: 利用屏幕录制软件(Eg:FSCapture,可设定矩形区域)录制信号采集过程,存储. 第二步,视频叠加制作 1)导入视频 2)主轨,复叠轨视频安插&时序调整 3)两个视频图 ...
- 计算机网络相关:应用层协议(一):DNS
DNS 1.概念 DNS是: 1) 一个有分层的DNS服务器实现的分布式数据库 2)一个使得主机能够查询分布式数据库的应用协议. 它运行在UDP之上,默认使用53号端口. 主要功能 是将主 ...
- PAT1124:Raffle for Weibo Followers
1124. Raffle for Weibo Followers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- iOS开发中数据持久化
使用几个小例子分别实现 归档NSKeyedArchiver.NSUserDefaults.plist文件数据存储,简单直观.代码地址
- Linux kernel的中断子系统之(一):综述
返回目录:<ARM-Linux中断系统>. 总结: 一从作为一名驱动工程师角度看,用好中断需要正确认识request_threaded_irq/request_irq关系.中断临界区保护. ...
- xml序列化和反序列化(二)
上篇讲到关于xml入参实体序列化,下面给出出参实体反序列化,代码如下: /// <summary> /// 反序列化 /// </summary> /// <param ...