【前言】

上一篇完成了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新版管道处理模型的更多相关文章

  1. 【4】Asp.Net Core2.2中间件多扩展对应应用

    [前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ...

  2. 【翻译】asp.net core2.1认证和授权解密

    asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...

  3. VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架

    https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具   2.打开VS2017,点击文件-新建-项目,选 ...

  4. asp.net core2.1认证和授权解密

    来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...

  5. Asp.net MVC进入请求管道的过程

    Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...

  6. ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇]

    ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇] 我们知道ASP.NET Web API借助于HttpSelfHostServer以Self Host模式寄宿于当 ...

  7. 细说Asp.Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

  8. 一步一步带你做WebApi迁移ASP.NET Core2.0

    随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...

  9. Asp.net Core2.0 缓存 MemoryCache 和 Redis

    自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...

随机推荐

  1. 第6次结对作业--郑锦伟&古维城

    第6次结对作业 在线英语学习平台客户端原型 1.结对成员 郑锦伟 2015034643034 古维城 2015034643033 2.原型设计工具实现-Photoshop 3.需求分析 使用NABCD ...

  2. Python:怎样用线程将任务并行化?

    如果待处理任务满足: 可拆分,即任务可以被拆分为多个子任务,或任务是多个相同的任务的集合: 任务不是CPU密集型的,如任务涉及到较多IO操作(如文件读取和网络数据处理) 则使用多线程将任务并行运行,能 ...

  3. 第二章之S5PV210在BL1中点亮LED灯

    1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_in ...

  4. Cookie SQL注入

    转自http://blog.sina.com.cn/s/blog_6b347b2a0101379o.html cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数已cookie方式提交 ...

  5. Collections.synchronizedMap()、ConcurrentHashMap、Hashtable之间的区别

    为什么要比较Hashtable.SynchronizedMap().ConcurrentHashMap之间的关系?因为常用的HashMap是非线程安全的,不能满足在多线程高并发场景下的需求. 那么为什 ...

  6. 深入理解SpringBoot之装配条件

    我们知道自动装配是SpringBoot微服务化的核心,它会把META-INF/spring.factoires里配置的EnableAutoConfiguration注册到IOC容器里.但是,请大家考虑 ...

  7. 附录C--拉格朗日对偶性

    1.原始问题 假设$f(x)$,$c_i(x)$,$h_j(x)$是定义在$R^n$上的连续可微函数,$x \in R^n$.考虑以下三类优化问题. 1.无约束的优化问题: \begin{align* ...

  8. 基于E-R模型的关系型数据库设计方法

    摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...

  9. SpringMvc 这篇文章写得不错 多多学习2017.6.29

    http://www.cnblogs.com/bigdataZJ/p/springmvc1.html  博客园链接

  10. 对于bootstrap可视化布局设计可以参考2017.6.2

    http://www.layoutit.cn/v3/index.html  可视化布局链接,拖好控件自动生成代码非常方便 http://www.jq22.com/jquery-info14044  这 ...