21 | 中间件:掌控请求处理过程的关键

这一节讲解一下如何通过中间件来管理请求处理过程

中间件工作原理

next 表示后面有一个委托,每一层每一层套下去可以在任意的中间件来决定在后面的中间件之前执行什么,或者说在所有中间件执行完之后执行什么

整个中间件的处理过程实际上有两个核心对象:

IApplicationBuilder

RequestDelegate:处理整个请求的委托

源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/MiddlewareDemo

IApplicationBuilder

namespace Microsoft.AspNetCore.Builder
{public interface IApplicationBuilder{IServiceProvider ApplicationServices { get; set; }IDictionary<string, object> Properties { get; }IFeatureCollection ServerFeatures { get; }// 最终它会 Build 返回一个委托// 这个委托就是把所有的中间件串起来之后,合并成一个委托方法// 这个方法的入参可以看下方委托的定义RequestDelegate Build();IApplicationBuilder New();// 它可以让我们去注册我们的中间件,把委托注册进去,每一个委托的入参也是一个委托// 这也就意味着可以把这些委托注册成一个链,就像上面的图显示的那样IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);}
}

委托的定义

namespace Microsoft.AspNetCore.Http
{// 委托的入参是 HttpContext,所有的注册中间件的委托实际上都是对 HttpContext 的处理public delegate Task RequestDelegate(HttpContext context);
}

接着让我们看一下应用程序里面是怎么让它工作的?

之前课程讲过 Configure 方法是用来注册中间件的

app.UseMyMiddleware();app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>
{endpoints.MapControllers();
});

根据刚才流程图表示的话,实际上中间件的执行顺序是跟注册顺序有关系的,最早注册的中间件它的权力是最大的,它可以越早的发生作用

中间件的注册实际上不仅仅是有上面展示的已有内置的中间件,实际上还可以用注册委托的方法来注册我们的逻辑

app.Use(async (context, next) =>
{await context.Response.WriteAsync("Hello");
});

因为这个中间件注册最早,而且不对后续的 next 做任何操作,所以启动之后无论输入什么都会输出 Hello

如果需要后续的中间件执行,那就意味着需要调用 next,可以在中间件执行之后再次 Hello 一次

app.Use(async (context, next) =>
{await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");
});

启动程序报错:

System.InvalidOperationException: Headers are read-only, response has already started.

意味着一旦应用程序已经对 Response 输出内容,我们就不能对 header 进行操作了,但是可以在 Response 后续继续写出信息

app.Use(async (context, next) =>
{//await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");
});

实际上除了 Use 这种方式的话,还有 Map 的方式

app.Map("/abc", abcBuilder =>
{abcBuilder.Use(async (context, next) =>{//await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");});
});

启动程序不会直接看到 Hello 输出,如果把地址改为 localhost:5001/abc,我们的输出就会变成 Hello2

也就是说当我们需要对特定的路径进行指定中间件的时候可以这样做

.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...相关推荐

  1. .NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(下)...

    21 | 中间件:掌控请求处理过程的关键 如果在 Map 的时候逻辑复杂一点,不仅仅判断它的 URL 地址,而且要做特殊的判断的话,可以这么做把判断逻辑变成一个委托 我们要判断当我们的请求地址包含 a ...

  2. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  3. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  4. 【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 第98讲:使用SBT开发时动手解决rt.jar中CharSequence is broken等问题学习笔记

    第98讲:使用SBT开发时动手解决rt.jar中CharSequence is broken等问题学习笔记 几乎所有从IDEA官网上下载安装在win上,采用默认方式自动运行的都 会遇到这个问题. er ...

  6. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 这里还有一个比较特殊的用法 一般情况下,我们前后端分离的架构,前端会编译成一个 index.html 文件和若干个 CSS 文件和 JavaSc ...

  7. .NET Core开发实战(第19课:日志作用域:解决不同请求之间的日志干扰)--学习笔记...

    19 | 日志作用域:解决不同请求之间的日志干扰 开始之前先看一下上一节的代码 // 配置的框架 var configBuilder = new ConfigurationBuilder(); con ...

  8. ASP.NET Core分布式项目实战(课程介绍,MVP,瀑布与敏捷)--学习笔记

    任务1:课程介绍 课程目标: 1.进一步理解 ASP.NET Core 授权认证框架.MVC 管道 2.掌握 Oauth2,结合 Identity Sercer4 实现 OAuth2 和 OpenID ...

  9. .NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)...

    22 | 异常处理中间件:区分真异常与逻辑异常 这一节我们来讲解一下错误处理的最佳实践 系统里面异常处理,ASP.NET Core 提供了四种方式 1.异常处理页 2.异常处理匿名委托方法 3.IEx ...

最新文章

  1. ​新型支架状电极允许人类思想操作计算机
  2. android 调整cpu频率,[IMX6DL][Android4.4] CPU频率调节模式以及降频方法
  3. [C#]利用键代码自动转换生成字母键或其它键信息
  4. 让引擎不再是你的唯一,对百度再见
  5. 计算机A级作文,关于被计算机的作文(共一篇)-疾风作文网
  6. UIControl IOS控件编程
  7. android 封装回调,OkHttp 优雅封装 OkHttps 之 回调线程魔变
  8. c语言求45678所有非平凡因子,近世代数基础习题课答案到第二章9题
  9. FAT32 文件系统详解
  10. kali 克隆网页_Web侦察工具HTTrack (网站克隆)
  11. Seata分布式事务原理
  12. Playmaker与iTween
  13. matlab空间计量AIC准则,空间计量经分析课件.ppt
  14. 土地购买[Usaco2008 Mar]
  15. 漫画 | 为什么程序猿996会猝死,而企业家007却不会?
  16. MySQL学习笔记①_案例记录
  17. Python自学的好方法
  18. html excel导出的路径,html 导出多个excel表格数据-如何将html页面中的表格导出到excel表格...
  19. Ocean Chain: 海洋渔业的价值连接器?
  20. THREAD APC 《寒江独钓》内核学习笔记(4)

热门文章

  1. Linux 环境变量 $PATH
  2. Android 使用XmlPullParser解析xml
  3. oracle基于时间恢复整个数据库
  4. 美国用户现在可以下载其所有Apple帐户数据,这是操作方法
  5. flac格式转换mp3格式_MP3,FLAC和其他音频格式之间有什么区别?
  6. 使用xUnit为.net core程序进行单元测试(3)
  7. Android文件Apk下载变ZIP压缩包解决方案
  8. Avalonia跨平台入门第二十二篇之人脸检测
  9. .NET 生态系统的蜕变之 .NET 6云原生
  10. 《Redis核心技术与实战》学习总结(2)