.NET Core基础:白话管道中间件
在Asp.Net Core中,管道往往伴随着请求一起出现。客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行。
举一个生活中比较常见的例子:旅游景区。
我们都知道,有些景区大门离景区很远,我们需要经过层层关卡才能到达景区。
我的请求最终就是去到景区,去到景区的整个过程就是管道,景区就是服务器,层层关卡就是一个个中间件了,比如:门票、停车费、摆渡费等等。
如果其中任何一个中间件卡壳了,比如我没买门票,那别人肯定是不让我进去,这就是管道短路了。
Asp.Net Core 请求管道包含一系列Http请求委托(RequestDelegate),依次调用。
微软给的图示:

.Net Core服务
在解释管道的使用方法之前,我们先来准备一个Asp.Net Core服务。
创建一个.Net Core控制台应用程序,并实现如下代码,一个简单的使用 Kestrel 托管的服务就完成了:
internal class Program{static void Main(string[] args){new WebHostBuilder().UseKestrel().UseStartup<Startup2>().Build().Start();Console.ReadLine();}}public class Startup{public void Configure(IApplicationBuilder app){}}

这也是.Net Core的优点之一,只选择我们需要的,摒弃那些多余的功能。优点是优点,一般开发中也犯不上这样去做。
Kestrel 托管默认监听端口:5000
管道中间件
微软这边内置了三个扩展函数供我们构建自己的中间件:
Use
Map
Run
其中Use和Map函数还提供了对应的分支扩展:UseWhen、MapWhen、UseMiddleware。下面我们一个个来解释。
app.Use
Use 是最常用的一种模式,承接上一个请求并执行下一个请求的任务
public void Configure(IApplicationBuilder app){app.Use(async (context, next) =>{Console.WriteLine("middleware1");await next.Invoke();});app.Use(async (context, next) =>{Console.WriteLine("middleware2");});}
app.UseWhen
UseWhen在Use的基础上提供了条件分支的功能
app.UseWhen(context =>// 判断请求路径的开头是否是/hcontext.Request.Path.StartsWithSegments(new PathString("/h")),c => c.Use(async (context, next) =>{Console.WriteLine("middleware1");await next.Invoke();}));app.Use(async (context, next) =>{Console.WriteLine("middleware2");});


app.Map
Map我们可以理解成专为请求路径扩展的分支中间件,可以根据请求路径去处理对应分支逻辑,与上面的UseWhen例子效果类似,但更加方便。
app.Map("/h", _app =>{_app.Use(async (context, next) =>{Console.WriteLine("hello world");});});
app.MapWhen
MapWhen与UseWhen类似,都是在请求上下文的基础上去扩展分支,比Map更加灵活。
app.MapWhen(context => { return context.Request.Query["name"] == "tony"; }, _app => {_app.Use(async (context, next) => {context.Response.ContentType = "text/plain; charset=utf-8";await context.Response.WriteAsync("i 服了 you");});});
app.Run
Run一般用于断路或请求管道的末尾,不会将请求传递下去
app.Run(async context =>
{
await context.Response.WriteAsync("hello world");
});
UseMiddleware
将一个完整的类添加到管道中间件,也就是将上面的请求委托,用类以及函数的形式替代了,便于我们的代码管理。
app.UseMiddleware<DotnetboyMiddleware>();public class DotnetboyMiddleware{private readonly RequestDelegate _next;private readonly string _name;public DotnetboyMiddleware(RequestDelegate next, string name){_next = next;_name = name;}public Task Invoke(HttpContext context){context.Response.WriteAsync($"my name is {_name}").Wait();return this._next(context);}}
微软内置的一些管道中间件扩展函数就介绍完了,下面我们实现一下微软实例图示中的效果:
public void Configure(IApplicationBuilder app){app.Use(async (context, next) =>{Console.WriteLine("middleware1 : in");await next.Invoke();Console.WriteLine("middleware1 : out");});app.Use(async (context, next) =>{Console.WriteLine("middleware2 : in");await next.Invoke();Console.WriteLine("middleware2 : out");});app.Run(async context =>{Console.WriteLine("Hello World");await context.Response.WriteAsync("Hello World");});}


从上面的例子中我们可以看到,中间件都是由上而下依次执行,由每个中间件决定是否继续执行下一个中间件,最终到响应结果。
如果哪个中间件决定不往下执行,那通道也就短路了,比如我们去掉 middleware2 的 await next.Invoke();
执行到 Console.WriteLine("middleware2 : out"); 就短路了,此路不通,原路返回。

因为管道中间件执行逻辑的关系,我们在实际开发中要注意两点:
1、谨慎使用管道短路
2、注意中间件的使用顺序,比如:路由中间件肯定是要在认证中间件前面执行,有中间件需要访问文件,在此之前就必须先执行开放静态文件的中间件
.NET Core基础:白话管道中间件的更多相关文章
- .NET Core基础篇之:白话管道中间件
在.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景区很远 ...
- Asp.Net Core基础篇之:白话管道中间件
在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...
- Core 1.0中的管道-中间件模式
ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...
- ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 中间件 上一章节中,我们我们有讲到 Startup 类中的 Confi ...
- ASP.NET Core 1.0中的管道-中间件模式
ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...
- .net core 基础知识
1.IOC(转:https://www.cnblogs.com/artech/p/inside-asp-net-core.html) IoC的全名Inverse of Control,翻译成中文就是“ ...
- ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...
- ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 静态文件 前几章节中,我们学习了 ASP.NET Core 的中间件 ...
- ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...
- ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 项目配置 ( Startup ) 前面几章节 ...
随机推荐
- .Net Core对于`RabbitMQ`封装分布式事件总线
首先我们需要了解到分布式事件总线是什么: 分布式事件总线是一种在分布式系统中提供事件通知.订阅和发布机制的技术.它允许多个组件或微服务之间的协作和通信,而无需直接耦合或了解彼此的实现细节.通过事件总线 ...
- win10使用python自动化安装mysql8.0.11
流程概要 下载mysql-8.0.11-winx64压缩包 解压 编辑配置文件my.ini 管理员权限cmd安装(注意初始化时设置默认密码为空) pymysql连接,执行sql操作. 代码实现 依赖: ...
- Python接口自动化测试(1)
接口自动化测试三部曲:1.构造请求 2.判断结果 3.数据库查询 1.Python的第三方包:requests 简介:requests可以用来做接口测试.接口自动化测试.爬虫等 requests的 ...
- SnowFlake 雪花算法详解与实现 & MP中的应用
BackGround 现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性. 对于 MySQL 而言,一个表中的主键 id 一般使用自 ...
- Archiver Appliance bug report(问题已解决,见文末)
本来想发到EPICS mailist里问的,可是发了两次给弹回来,不方便的等不及了,就在这问吧,谁知道怎么解决麻烦一定指导一下. ########################## Hi ALL: ...
- Redux Toolkit 的使用方法
Redux Toolkit 是什么? Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集.它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你 ...
- Blue Mary开公司
Blue Mary开公司 题面:[JSOI2008]Blue Mary开公司 题目大意: 每次加入一条形如 \(y=Px + S - P\) 的直线,询问 \(x=T\) 时此处最高的 \(y\) 值 ...
- OpenLayers结合Turf实现空间运算
1. 引言 空间运算利用几何函数来接收输入的空间数据,对其进行分析,然后生成输出数据,输出数据为针对输入数据执行分析的派生结果. 可从空间运算中获得的派生数据包括: 作为输入要素周围缓冲区的面 作为对 ...
- postgresql VACUUM 不会从表中删除死行的三个原因
一.为什么是VACUUM? 每当更新或删除PostgreSQL表中的行时,都会留下死元组.VACUUM摆脱了它们,以便空间可以重复使用.如果一个表没有被清理,它就会变得臃肿,这会浪费磁盘空间并减慢表的 ...
- (一)钉钉宜搭低代码应用开发高级认证之远程API调用方法示例
大家好,我是代号六零一,在此分享近期学习的低代码开发知识~,如有疑问欢迎在评论区下方点评,作者愿与您一道共同探讨: 一.创建数据源 二.请求地址配置 钉钉路径示例:/dingtalk/web/APP_ ...