【ASP.NET Core快速入门】(八)Middleware管道介绍、自己动手构建RequestDelegate管道
中间件是汇集到以处理请求和响应的一个应用程序管道的软件。 每个组件:
- 可以选择是否要将请求传递到管道中的下一个组件。
- 之前和之后调用管道中的下一个组件,可以执行工作。
使用请求委托来生成请求管道。 请求委托处理每个 HTTP 请求。
请求中使用委托来配置运行,映射,和使用扩展方法。 一个单独的请求委托,它可将指定的在行作为匿名方法 (称为中,线中间件),或可以在可重用的类中定义它。 这些可重用的类和行在匿名方法中间件,或中间件组件。 在请求管道中的每个中间件组件负责调用管道中的下一个组件,或如果相应短路链。
使用 IApplicationBuilder 创建中间件管道
ASP.NET 核心请求管道由请求委托,调用一次是在另一个,如图所示 (执行如下所示的黑色箭头的线程) 的顺序组成:

我们可以链接多个请求委托连同app.use。 next参数表示管道中的下一步委托。我们一共有两种办法构建管道:

然后执行dotnet build生成项目后执行 dotnet run 来运行我们我们的程序

如果我们在第二步的时候不调用Invoke会怎样?我们先执行 dotnet watch run
然后 我们再修改代码:


IApplicationBuilder是用来构建管道的,我们可以通过Use来注册中间件,同时可以传递给我们一个next的Deletegate的委托。在这个情况下,我们可以调用下一步中间件的委托,如果我们不调用的话,后面的管道就终止了。
还有一点就是IApplicationBuilder会提供给我们一个Map,我们可以理解为路由的机制。

我们后面的路由也是在这个基础上进行配置的。运行效果:

自己动手构建RequestDelegate管道
什么是RequestDelegate
ASP.NET Core的中间件通过一个类型Func<RequestDelegate, RequestDelegate>的委托对象来表示,而RequestDelegate也是一个委托,它代表一项请求处理任务。
每个中间件都承载着独立的请求处理任务,它本质上也体现了在当前HttpContext下针对请求的处理操作,那么为什么中间件不直接通过一个RequestDelegate对象来表示,而是表示为一个类型为Func<RequestDelegate, RequestDelegate>的委托对象呢?原因很简单,中间件并不孤立地存在,所有注册的中间件最终会根据注册的先后顺序组成一个链表,每个中间件不仅仅需要完成各自的请求处理任务外,还需要驱动链表中的下一个中间件。
对于一个由多个Func<RequestDelegate, RequestDelegate>对象组成的中间链表来说,某个中间件会将后一个Func<RequestDelegate, RequestDelegate>对象的返回值作为输入,而自身的返回值则作为前一个中间件的输入。某个中间件执行之后返回的RequestDelegate对象不仅仅体现了自身对请求的处理操作,而是体现了包含自己和后续中间件一次对请求的处理。那么对于第一个中间件来说,它执行后返回的RequestDelegate对象实际上体现了整个应用对请求的处理逻辑。
模拟RequestDelegate
首先先用VSCode新建一个控制台项目:MyPipeline,然后打开
dotnet new console --name MyPipeline
新建一个Context.cs类
using System;
using System.Threading.Tasks; namespace MyPipeline
{
public class Context
{ }
}
新建一个RequestDelegate.cs类
using System;
using System.Threading.Tasks; namespace MyPipeline
{
public delegate Task RequestDelegate(Context context);
}
在Program.cs中声明一个接收委托、返回委托的List,并初始化
public static List<Func<RequestDelegate,RequestDelegate>> _list=new List<Func<RequestDelegate,RequestDelegate>>();
//模拟ApplicationBuilder中的app.Use方法
public static void Use(Func<RequestDelegate,RequestDelegate> middleware)
{
_list.Add(middleware);
}
在Main中调用
static void Main(string[] args)
{ //第一步
Use(next=>{
return context=>{
System.Console.WriteLine("");
return next.Invoke(context);
//return Task.CompletedTask;
};
});
//第二步
Use(next=>{
return context=>{
System.Console.WriteLine("");
return next.Invoke(context);
};
}); RequestDelegate end=(context)=>{
System.Console.WriteLine("end...");
return Task.CompletedTask;
}; _list.Reverse(); foreach(var middleware in _list)
{
end=middleware.Invoke(end);
} //这时候我们没有Context,所以直接new一个Context给它
end.Invoke(new Context()); Console.ReadLine();
}
结果:

这个时候我们在第一步进行终止操作:

结果:

【ASP.NET Core快速入门】(八)Middleware管道介绍、自己动手构建RequestDelegate管道的更多相关文章
- 菜鸟入门【ASP.NET Core】8:Middleware管道介绍、自己动手构建RequestDelegate管道
中间件:是汇集到以处理请求和响应的一个应用程序管道的软件. 每个组件: 可以选择是否要将请求传递到管道中的下一个组件. 之前和之后调用管道中的下一个组件,可以执行工作. 使用请求委托来生成请求管道. ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页 任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...
- ASP.NET Core快速入门_学习笔记汇总
第2章 配置管理 任务12:Bind读取配置到C#实例 任务13:在Core Mvc中使用Options 任务14:配置的热更新 任务15:配置框架设计浅析 第3章 依赖注入 任务16:介绍- 任务1 ...
- ASP.NET Core快速入门--学习笔记系列文章索引目录
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 抓住国庆假期的尾巴完成了此系列课程的学习笔记输出! ASP.NET Core快 ...
- ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHost 的配置与启动 ...
- ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)
引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...
- ASP.NET Core轻松入门之Middleware管道模型
Middleware指的是微软的的asp.net core的管道模型.其原理可以用微软官方的下图展示: 原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方 ...
- 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options
命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...
随机推荐
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNu ...
- VS2017下使用Git遇到的问题
我在使用最新版的VS2017时,想获取服务器上最新代码,Fetch到了最新修改,但是在拉取代码的时候出现了问题 user@user-PC MINGW64 /d/demo/myrepos (dev-cs ...
- 二维数组的最大子数组和 时间复杂度:O(n的四次方)
先上代码 小组成员:高达,李奔 package 三月二十一号; import java.io.BufferedReader; import java.io.FileReader; import jav ...
- python | Elasticsearch-dsl常用方法总结(join为案例)
Elasticsearch DSL是一个高级库,其目的是帮助编写和运行针对Elasticsearch的查询.它建立在官方低级客户端(elasticsearch-py)之上. 它提供了一种更方便和习惯的 ...
- apidoc @apiGroup兼容中文
1.找到安装目录 中 api_group.js C:\Users\ZhiJiao361\AppData\Roaming\npm\node_modules\apidoc\node_modules\api ...
- 根据excel表格字段生成sql语句
根据excel表格字段生成sql语句 1.1 前言 根据excel表格字段生成sql语句主要是利用了excel的拼接函数 CONCATENATE .该实例主要以mysql脚本支持.实例需求如下:exc ...
- 解决微信小程序video属性controls失效问题
<view class="VideoBox"> <video class='myVideo' id="myVideo01" src=" ...
- 【RL-TCPnet网络教程】第15章 RL-TCPnet之创建多个TCP连接
第15章 RL-TCPnet之创建多个TCP连接 本章节为大家讲解RL-TCPnet的TCP多客户端实现,因为多客户端在实际项目中用到的地方还挺多,所以我们也专门开启一个章节做讲解.另外,学习 ...
- 分布式数据中间件TDDL、Amoeba、Cobar、MyCAT架构比较
框架比较 TDDL Amoeba Cobar MyCat 点评 TDDL不同于其它几款产品,并非独立的中间件,只能算作中间层,是以Jar包方式提供给应用调用.属于JDBC Shard的思想,网上也有很 ...
- [Swift]LeetCode32. 最长有效括号 | Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...