希望给你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方法放在所有管道中间件的最后。

希望以上分享对你有帮助,我是IT人张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注

4.4管道和中间件介绍「深入浅出ASP.NET Core系列」的更多相关文章

  1. 1.1专题介绍「深入浅出ASP.NET Core系列」

    大家好,我是IT人张飞洪,专注于.NET平台十年有余. 工作之余喜欢阅读和写作,学习的内容包括数据结构/算法.网络技术.Linux系统原理.数据库技术原理,设计模式.前沿架构.微服务.容器技术等等…… ...

  2. 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略 ...

  3. 4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 管道实现机制 要了解管道的实现机制,我们必须要深入框架的源码,幸亏微软开源了,我们可以访问GitHub的地址来下载 ...

  4. 5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. Cookie-Based认证 认证流程 我们先看下传统Web端的认 ...

  5. 1.2环境安装「深入浅出ASP.NET Core系列」

    官网 在介绍安装环境之前,先介绍周边信息,比如微软net官网. https://www.microsoft.com/net 这个网站是学习微软技术栈比较权威的地方,包括环境下载,学习,架构,文档,社区 ...

  6. 2.3Options建立配置和实体的映射「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. Startup.cs中创建MVC中间件 关键代码:services.AddMvc();app.UseMvcWith ...

  7. 目录导航「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 入门篇 引子 1.1专题介绍 1.2环境安装 1.3创建项目 1.4部署到IIS 1.5准备CentOS和Ngin ...

  8. 5.3Role和Claims授权「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. Role授权 这是一种Asp.Net常用的传统的授权方法,当我们在 ...

  9. 5.2基于JWT的令牌生成和定制「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. Token生成 我们知道一旦我们给API添加[Authorize] ...

随机推荐

  1. [POI2007]洪水pow bfs

    发现:只在所有自己的城市建水泵一定是最优解. 所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的 sort+bfs...... #inclu ...

  2. B哥竟然也被裁了,聊一聊我的看法

    B哥的故事 B哥是在17年底朋友聚会上认识的一个哥们,因为都是程序员,也聊得来.就加了微信.今年是他北漂的第三个年头了. B哥是从小南方长大的一个男孩,高中学习还凑凑活活,勉强过了二本,上了大学没人管 ...

  3. Hive使用必知必会系列

    一.Hive的几种数据模型 内部表 (Table 将数据保存到Hive 自己的数据仓库目录中:/usr/hive/warehouse) 外部表 (External Table 相对于内部表,数据不在自 ...

  4. Java并发编程面试题 Top 50 整理版

    本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...

  5. C# 错误:空对象不能转换为值类型

    最近在做项目的时候出现了一个错误 当从数据库中获取值的时候 报错:空对象不能转换为值类型 因为数据库你查询数据的时候不是所有的字段都是存在数据的,有些字段可能是Null值,也就是没有数据 当你在类型转 ...

  6. 第四周LINUX 学习笔记

    内核编译丶sed丶awk Linux:单内核    模块化:动态      /lib/modules      lsmod,modinfo,modprobe,insmod,,modprobe -r , ...

  7. 如何在WSL下使用VS Code

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.本有由葡萄城技术团队翻译并整理 自微软开始宣布拥抱开源以来,我认为微软发布的最棒的两大功能是:Visual S ...

  8. Storm入门(九)Storm常见模式之流聚合

    流聚合(stream join)是指将具有共同元组(tuple)字段的数据流(两个或者多个)聚合形成一个新的数据流的过程. 从定义上看,流聚合和SQL中表的聚合(table join)很像,但是二者有 ...

  9. SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+PageHelper

    上篇文章我们介绍了SpringBoot和MyBatis的整合,可以说非常简单快捷的就搭建了一个web项目,但是在一个真正的企业级项目中,可能我们还需要更多的更加完善的框架才能开始真正的开发,比如连接池 ...

  10. Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

    Kubernetes简介 Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的 ...