【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】
想了解更多干货,欢迎关注公众号【程序员在职场】
程序员在职场