欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【3】Asp.Net Core2.2新版管道处理模型

程序员文章站 2022-04-08 18:49:39
【前言】 上一篇完成了Asp.Net Core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的MVC没啥差别!但这些都是在组件封装的基础上完成的,在Core里面,其实更多的东西是靠订制的,而不是实现固定的,包括管道处理模型!本文将跟大家探讨一下,Asp.Net C ......

【前言】

上一篇完成了asp.net core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的mvc没啥差别!但这些都是在组件封装的基础上完成的,在core里面,其实更多的东西是靠订制的,而不是实现固定的,包括管道处理模型!本文将跟大家探讨一下,asp.net core 2.2全新的管道处理模型!

 

【管道处理模型】

 

何谓管道处理模型?本质上就是对http请求的处理过程,在程序中表现为对 httpcontext 的一系列操作,即通过对 request 的处理,来生成 reponse,仅此而已。下面给大家一个经典的asp.net的处理管道示意图:

【3】Asp.Net Core2.2新版管道处理模型

 

 

http请求进入到程序时,已经是一个httpworkerrequest了,加工成httpcontext,然后交给一个httpapplication来处理,这里由19个主要的事件构成,覆盖了请求处理的各个步骤,然后基于事件的注册,能够让我们进行灵活的扩展,扩展性非常棒!

 

然而,在asp.net core里面,却出现了一套更先进的管道流程,让人叹服!下面让eleven带大家来看看,还能怎么样更先进!

 

 

【新管道模型】

 

还记得那个startup类里面的那个configure方法吗?这里就是用来配置http的请求管道的。第一个参数iapplicationbuilder,就是用来构建请求管道的。

【3】Asp.Net Core2.2新版管道处理模型

 

这里是个接口,其默认实现类是applicationbuilder,是开源的,大家可以自己去下载看的。该类的核心要素有三个:

 

1 存放middleware容器,private readonly ilist<func<requestdelegate, requestdelegate>> _components;

2 我们熟悉的use方法,_components.add(middleware),将middleware放进去;

3 build()方法,在 hosting 的启动中,最后就是通过该方法创建一个 requestdelegate 类型的委托来完成整个请求的响应。

【3】Asp.Net Core2.2新版管道处理模型

 

步骤梳理如下:

1 定义了一个 404 的requestdelegate,作为最原始的参数;

2 用reverse函数将注册的中间件列表进行反转;

3 调用最后注册的那个middleware,结果还是requestdelegate类型变量;

4 继续倒序调用之前注册的middleware,最终得到一个requestdelegate。

而requestdelegate是一个接受httpcontext参数,然后完成一个操作的委托,也就是对http请求的一个步骤。因为下一个middleware是上一个middleware的参数,让程序可以将整个步骤穿起来,类似于俄罗斯套娃,按我们的注册顺序从里到外,一层套一层。

 

【use】

 

下面来使用use方法注册3个middleware,来详解一下执行顺序,捋一捋新管道模型是怎么构建的,看看这个神奇的“俄罗斯套娃”!先注册2个常规的middleware:

 

【3】Asp.Net Core2.2新版管道处理模型

 

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

 

【3】Asp.Net Core2.2新版管道处理模型

 

程序运行的表现是怎么样的呢?

 

首先在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;

 

这就是全部过程!小伙伴儿们,能看明白吗?这就是个典型的俄罗斯套娃式,再借用个经典的中间件管道模型图给大家。

 

【3】Asp.Net Core2.2新版管道处理模型

 

 

【结语】

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

 

作者:eleven

来源:公众号【软谋net】

 

想了解更多干货,欢迎关注公众号【程序员在职场

【3】Asp.Net Core2.2新版管道处理模型

                  程序员在职场