【前言】

上一篇完成了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. Python 函数和相关用法笔记

    python中%r和%s的区别 总结:%r打印时能够重现它所代表的对象 __str__和__repr__的用法

  2. Spring Boot 发送邮件

    需求 最近因为业务的变更,需要对老用户进行发送邮件处理.目前市面上也有很多代发邮件的接口,可以接入.由于量不是特别大,放弃了这个途径.改用我们自己通过 smtp 发送邮件来处理. 技术选择 Java ...

  3. 【转】高效利用Fundebug追踪Node.js日志发现问题

    不管使用哪个语言做项目开发,我们都会自觉地用日志来做相关记录.比如,HTTP请求,报错信息.某些关键节点埋点记录等等.在Java中有大名鼎鼎的Log4J,于是在Node.js中也有了log4js. 日 ...

  4. java里常用的redis客户端简介

    Redis的各种语言客户端列表,请参见Redis Client.其中Java客户端在github上start最高的是Jedis和Redisson.Jedis提供了完整Redis命令,而Redisson ...

  5. 数据结构之ConcurrentHashMap

    并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap ...

  6. jquery遍历table为每一个单元格取值及赋值

    表格代码 <tr> <td> <input type="text" style="border: none; text-align: cen ...

  7. VirtualBox报错:不能为虚拟电脑XXX打开一个新任务

    报错产生的背景 今天在这里下载了一个用于VirtualBox的Kali Linux虚拟机文件(使用VirtualBox可以直接打开使用,不用执行安装过程).但是将该文件导入到VirtualBox中之后 ...

  8. ansj原子切分和全切分

    ansj第一步会进行原子切分和全切分,并且是在同时进行的.所谓原子,是指短句中不可分割的最小语素单位.例如,一个汉字就是一个原子.全切分,就是把一句话中的所有词都找出来,只要是字典中有的就找出来.例如 ...

  9. MySQL,简单了解下、

    第一章 数据备份与导入导出 1.1.备份基本概念介绍 1.2.mysqldump详解 1.3.mydumper浅析 1.4.MySQL物理备份基本操作 1.5.了解mysqlpump工具 1.6.数据 ...

  10. Get Docker CE for CentOS

    To get started with Docker CE on CentOS, make sure you meet the prerequisites, then install Docker. ...