.Net Core 管道底层源码实现
在 .NET Core 中,请求处理管道是一个中间件(Middleware)链,用于处理 HTTP 请求并生成响应。管道的底层实现基于
Microsoft.AspNetCore.Http命名空间中的一些核心类和接口
1. 核心组件
1.1 HttpContext
- •
HttpContext是 HTTP 请求和响应的核心抽象,封装了请求信息(如请求头、请求体、查询参数等)和响应信息(如状态码、响应头、响应体等)。 - • 每个请求都会创建一个
HttpContext实例,并在整个管道中传递。
1.2 HttpRequest 和 HttpResponse
- •
HttpRequest和HttpResponse分别表示 HTTP 请求和响应,是HttpContext的一部分。 - •
HttpRequest包含请求的详细信息,如路径、方法、头、体等。 - •
HttpResponse用于设置响应的状态码、头、体等。
1.3 RequestDelegate
- •
RequestDelegate是一个委托,表示处理 HTTP 请求的方法:
public delegate Task RequestDelegate(HttpContext context);
- • 管道中的每个中间件都是一个
RequestDelegate。
1.4 Middleware
- • 中间件是一个类或方法,用于处理请求并调用管道中的下一个中间件。
- • 中间件通常通过
Use或Run方法注册到管道中。
2. 定义 ApplicationBuilder 接口
首先,我们定义 IApplicationBuilder 接口:
public interface IApplicationBuilder
{
// 添加中间件到管道中
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);
// 构建最终的请求处理管道
RequestDelegate Build();
// 获取或设置应用程序服务提供者
IServiceProvider ApplicationServices { get; set; }
// 获取属性字典,用于存储共享数据
IDictionary<string, object> Properties { get; }
}
3. 定义 RequestDelegate 委托
管道的核心是基于委托(Delegate)和上下文(Context)的机制。
**RequestDelegate**:是一个表示处理 HTTP 请求的委托。
public delegate Task RequestDelegate(HttpContext context);
- •
**HttpContext**:封装了 HTTP 请求和响应的所有信息,包括请求头、请求体、响应头、响应体等。
每个中间件本质上是一个 RequestDelegate,它接收 HttpContext 并处理请求,同时可以选择调用下一个中间件。
4. 实现 ApplicationBuilder 类
接下来,我们实现 ApplicationBuilder 类:
public class ApplicationBuilder : IApplicationBuilder
{
// 存储中间件组件的列表
private readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();
// 获取或设置应用程序服务提供者
public IServiceProvider ApplicationServices { get; set; }
// 获取属性字典,用于存储共享数据
public IDictionary<string, object> Properties { get; } = new Dictionary<string, object>();
// 添加中间件到管道中
public IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
{
_components.Add(middleware);
return this;
}
// 构建最终的请求处理管道
public RequestDelegate Build()
{
// 默认的请求处理程序,返回 404 状态码
RequestDelegate app = context =>
{
context.Response.StatusCode = 404;
return Task.CompletedTask;
};
// 反向遍历中间件组件列表,构建嵌套的请求处理管道
foreach (var component in _components.Reverse())
{
app = component(app);
}
return app;
}
}
5. 创建中间件
我们创建一个简单的日志收集中间件来展示如何使用 **ApplicationBuilder** :
public class CustomizeMiddleware
{
private readonly RequestDelegate _next;
// 构造函数,接受下一个中间件的委托
public CustomizeMiddleware(RequestDelegate next)
{
_next = next;
}
// 中间件的请求处理方法
public async Task Invoke(HttpContext context)
{
Console.WriteLine("自定义中间件: Before");
await _next(context); // 调用下一个中间件
Console.WriteLine("自定义中间件: After");
}
}
6. 使用 ApplicationBuilder 构建管道
public class Program
{
public static void Main(string[] args)
{
// 创建 ApplicationBuilder 实例
var builder = new ApplicationBuilder();
// 添加 CustomizeMiddleware 到管道中
builder.Use(next => new CustomizeMiddleware(next).Invoke);
// 添加内联中间件到管道中
builder.Use(next => async context =>
{
Console.WriteLine("内联中间件: Before");
await next(context); // 调用下一个中间件
Console.WriteLine("内联中间件: After");
});
// 构建最终的请求处理管道
var app = builder.Build();
// 创建一个 HttpContext 实例
var context = new DefaultHttpContext();
// 执行管道
app(context).Wait();
}
}
输入结果为:

7.总结
.NET Core 管道的底层实现是基于委托链的机制,每个中间件都是一个 RequestDelegate,通过链式调用来处理 HTTP 请求和响应。管道的构建过程通过 IApplicationBuilder 接口完成,中间件的添加顺序决定了管道的执行顺序。通过理解管道的底层实现,可以更好地掌握 .NET Core 的请求处理机制,并能够灵活地配置和扩展管道。

.Net Core 管道底层源码实现的更多相关文章
- AspNetCore底层源码剖析(三)IOC
title: AspNetCore底层源码剖析(三)IOC date: 2022-09-21 13:20:01 categories: 后端 tags: - .NET 介绍 每个 ASP.NET Co ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 为什么很多类甚者底层源码要implements Serializable ?
为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- List-ArrayList集合基础增强底层源码分析
List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...
- 从底层源码浅析Mybatis的SqlSessionFactory初始化过程
目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- 2018.11.20 Struts2中对结果处理方式分析&struts2内置的方式底层源码剖析
介绍一下struts2内置帮我们封装好的处理结果方式也就是底层源码分析 这是我们的jar包里面找的位置目录 打开往下拉看到result-type节点 name那一列就是我们的type类型取值 上一篇博 ...
- 全方位深度剖析PHP7底层源码(已完结)
第1章 课程介绍本章主要介绍课程要讲的知识点,以及课程要求等. 第2章 PHP7的新特性本章主要介绍PHP7的新特性,做基准测试,与PHP5对比验证PHP7的性能提升程度,引出对PHP7源码学习的必要 ...
- BAT资深工程师 由浅入深分析 Tp5&Tp6底层源码 - 分享
BAT资深工程师由浅入深分析Tp5&Tp6底层源码 第1章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的 ...
随机推荐
- C#/.NET/.NET Core优秀项目和框架2024年10月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...
- 对于特定的游戏问题使用启发式算法可以取得比AI算法更好的表现
相关: Using A.I. to DOMINATE NERDS in TETRIS 有些问题的求解可以通过建模将其转换为强化学习问题,然后再使用强化学习算法对其进行求解,但是很多问题如果不建模为强化 ...
- 关于C++当中的指针悬空问题
一.哪里遇到了这个问题 在进行MNN机器学习框架的MFC应用开发的时候遇到了这个问题,在窗口控件代码段 "MNN_Inference_BarCode_MFCDlg.cpp" 当中需 ...
- 支持多语言、多商店的商城,.Net7 + EF7领域驱动设计架构
推荐一个跨平台.模块化.可扩展且超快速的开源一体化电子商务平台. 01项目简介 Smartstore 支持桌面和移动平台.多语言.多商店.多货币的商城,并支持SEO优化,支持无限数量的产品和类别.报表 ...
- frida 连接夜神模拟器
adb connect 127.0.0.1:62001 adb devices adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27 ...
- delphi 图形图像处理 Image32
delpher 越来越少了,但不能掩盖它的优秀,很外前看到了 Image32,但发现用它的人很少,这段时间整理了它的资料,重新组合了一个DEMO,也可以说是个小工具,分享出来. Image32 关于I ...
- (Python基础教程之六)Python中的关键字
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- 【Spring】IOC核心源码学习(二):容器初始化过程
接上文 啃啃老菜: Spring IOC核心源码学习(一) ,本文将以 ClassPathXmlApplicationContext 这个容器的实现作为基础,学习容器的初始化过程. ClassPath ...
- PHP之环境搭建(php7.4 + php8.1)
之前写过几次,使用lnmp,宝塔,源码编译等方式来进行PHP环境的搭建, 随着接触的越来越多, 这里做一个总结, 常用的搭建方式 1.编译安装 之前写个几次,可以参考之前的 这次记录下多个版本PHP的 ...
- 基于docker的常用服务搭建
使用docker搭建相关服务: 1. MySQL服务 1) 拉取镜像 docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mys ...