4.4管道和中间件介绍「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。
管道流
我们知道一个管道可以有一个或多个中间件,而中间件的职责是根据HttpContext处理HTTP请求,然后往Response里填充东西,最后完成整个Response的输出。了解管道流机制,就能知道如何利用管道进行拦截,自定义封装中间件等高级操作,所以学习管道流机制对我们编码有质的提高。那么管道数据是如何流通的呢?如下图所示,Request进入Middleware 1,叠加一层逻辑代码到HttpContext(切确说是HttpContext的Response对象),然后调用next()进入到下一个Middleware 2,依次递推,最后所有的逻辑代码叠加完毕后返回前端。
管道实践
IApplicationBuilder构建管道有两种方法,分别是Use和Run方法,他们的区别在下面会谈到。
app.Use方法
这里先了解Use方法的第一个重载,如下图所示,他是一个类型为委托的中间件(middleware)。
这个中间件同时携带一个next的RequestDelegate委托,可以实现调用下一个管道中间件,我们看下代码实践,如下所示,context从当前管道进来,处理后,通过next.Invoke()转移到下一个管道,完成一个管道的生命周期。
其实我更喜欢截图,因为可以任意打标注,但是不方便拷贝,所以一起贴上代码吧。
app.Use(async (context, next) => { await context.Response.WriteAsync("fisrt……"); await next.Invoke(); });
以上的用法,如果是新手可能不知其所以然,用没问题,但是内部是如何实现的?不知道!其实这里使用到了语言的高级特性委托,通过委托实现了开闭原则,也就是把管道的扩展开放出来,我们可以使用规定的app.Use方法,但是内部定义的委托参数类型,比如context,Fun<task>则对外屏蔽了实现。所以你看到的next.Invoke()已经封装了具体的实现了,对于使用者,其实可以不用去管那么多,拿来用即可。
app.Use还有另外一个重载,如下图提示:这里Func传入一个RequestDelegate,返回一个RequestDelegate。不同于第一个重载,他没有next.Invoke()的调用,而是之间返回一个RequestDelegate给app进行处理。
我们看下代码实现,外层红色框是传入的管道,内部绿色框是返回的管道。
app.Run
app.Run和app.Use不同之处在于,app.Use可以调用下一个管道中间件,app.Run不会,我们演示一段代码。
app.Use(async (context, next) => { await context.Response.WriteAsync("<html><body>"); await context.Response.WriteAsync("<div>Inside middleware defined using app.Use</div>"); await next(); await context.Response.WriteAsync("</body></html>"); }); app.Run(async context => { await context.Response.WriteAsync("<div>Inside middleware defined using app.Run</div>"); });
//该管道会不会被打印呢? app.Use(async (context, next) => { await context.Response.WriteAsync("<html><body>"); await context.Response.WriteAsync("<div>Another Middleware defined using app.Use</div>"); await next(); await context.Response.WriteAsync("</body></html>"); });
如下图所示,我们看到Run后面定义的第二个Use没有打印出来,这是因为Run不会调用随后的管道中间件导致的,所以我们一般习管性把Run方法放在所有管道中间件的最后。
希望以上分享对你有帮助,我是张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
冲鸭!强烈推荐 Java 工程师的几本电子书
冲鸭!强烈推荐 Java 工程师的几本电子书 每年双十一都是一个狂欢的日子,想买的东西有太多,那今年的双11,程序员买什么最划算?在我看来双11,买啥都不如买知识,不占空间,还能够让自己变得更好! 为了能更好地帮助各位开发者,一直不断地加快新技术的普及,不断上新质量过硬的小册,让更多开发者可以更快更方便的学习到最新的技术。 一起来看看通过小册可以 GET 到哪些技能吧! ◆ Redis 深度历险:核心原理与应用实践 ◆ 你会学习到: Redis应用 分布式锁、延时队列、位图、HyperLogLog、布隆过滤器、限流、GeoHash、Scan Redis原理 IO现场模型、通信协议、持久化、管道、事务、PubSub、对象压缩、主从同步 Redis集群 Sentinel、Codis、Cluster ◆ Netty 入门与实战:仿写微信 IM 即时通讯系统 ◆ 你会学习到: 服务端如何启动 客户端如何启动 长连自定义协议如何设计 粘包拆包原理与实践 如何实现自定义编解码 pipeline 与 channelHandler 心跳与空闲检测 ◆ 前端性能优化原理与实践 ◆ 你会学习到: 前端性能...
- 下一篇
十年Java架构学习经验总结:第六点尤为重要
你有没有静下心来思考过:同样是做了x年Java开发,为什么你的技术比别人差很多?为什么别人每月28K你却只有10K? 其实技术水平的高低和个人智商关系不大(毕竟能做Java编程开发大家都不会差),主要和勤奋程度、提升方法有关。 勤奋程度不必多说,全靠自我监督和自制力。在这里我们详细谈谈提升方法,毕竟好的提升方法会让你事半功倍。到底有哪些有效的好方法,能帮助我们进阶成Java高级工程师呢? 下面这3种方法,你应该加以重视: 吃透基础技术 养成良好的阅读源码的习惯 有长期的技术学习规划 下面,我们来一起逐条看看,特别是第 3 个方法。 吃透基础技术 基础技术是各种上层技术共同的基础。吃透基础技术是为了更好地理解程序的运行原理,并基于这些基础技术进化出更优化的产品。很多分布式系统架构,以及高可用、高性能、高并发的解决方案基本都可以在基础技术上找到它们的身影。所以,对基础技术的学习才能够更好地掌握更高维度的技术。 很多人会觉得底层技术博大精深,从语言、编程范式、算法和数据结构、计算机原理、网络、数据库、分布式技术等等,怎么可能有时间去掌握这么多东西呢。这确实需要持续学习的毅力,现在很多技术大牛...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果