【前言】

上一篇完成了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. 洛谷 P1490 解题报告

    P1490 买蛋糕 题目描述 野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕.大家不知道最后要买的蛋 ...

  2. Java IO流对象、多线程

    Input(读) Output(写)操作 File类 import java.io.File; 将操作系统中的文件.目录(文件夹).路径.封装成File对象 提供方法,操作系统中的内容.File与系统 ...

  3. Visual Studio 201~ Code 格式检查

    前言 好的代码格式,有利于阅读和查错,慢慢的有利于养成良好的编码习惯,也可以帮我们找出一些低级错误. StyleCop 在Nuget上搜索stylecop,选择MSBuild的那个版本,安装. 手动编 ...

  4. PAT1021:Deepest Root

    1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph ...

  5. 第二章:第一个Netty程序

    第一步:设置开发环境 • 安装JDK,下载地址http://www.oracle.com/technetwork/java/javase/archive-139210.html   • 下载netty ...

  6. win7 中如何设置eclipse的背景色--Console

    http://blog.csdn.net/u013161399/article/details/47297781

  7. SSM-SpringMVC-22:SpringMVC中转发(forward)和重定向(redirect)

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 转发和重定向大家都熟悉,都学到框架了,怎么能不了解转发和重定向呢? 如果有不熟悉的,可以去百度搜几篇博客去看看 ...

  8. mac 上安装 nvm 遇到的坑

    本人之前在 mac 上已经装过 nvm 了,今天帮朋友在他电脑上装,由于是新版本,没想到有点坑. ** 一定要参考官方文档 一.命令行安装  (图片来自 github ) 意思是,无论你安装还是更新 ...

  9. Activity的运行过程

    今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...

  10. sql server 高可用故障转移(3)

    虚拟磁盘创建 前面我们已经搭了域和两台sql 服务器, 下面我们准备让DC域服务器除了担当域控制器外,还行使另一个职能:充当集群共享存储. 集群共享存储是由群集内的每个节点都能共同访问的一个存储设备, ...