.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章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的 ...
随机推荐
- CSS动画(轮播图)
1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa78enaFEibNNCoXO9Hr2PI7boFTRgZHl3icicXwzLGLTQPxCl ...
- SHA1withRSA签名Python版本
from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA ...
- Scala代码练习
1.编程实现百分制转换成五级制,规则如下: 90~100分,返回优秀: 80~89分,返回良好: 70~79分,返回中等: 60~69分,返回及格: 60分以下,返回不及格. object grade ...
- Spark Web UI 监控详解
Spark集群环境配置 我们有2个节点,每个节点是一个worker,每个worker上启动一个Executor,其中Driver也跑在master上.每个Executor可使用的核数为2,可用的内存为 ...
- Mysql数据库个人整理笔记
数据类型 tinyint/smallint/int/bigint float double char/varchar date/time/datetime/timestamp DDL 数据库 crea ...
- 6.Kubernetes集群管理工具kubectl
Kubernetes集群管理工具kubectl 概述 kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署 命令格式 ...
- thinkpad x250装manjaro linux,解决指纹和远程桌面问题
前言 家里有个thinkpad x250闲置,平时主要用windows,大概隔一年半年装一次linux看看发展程度. 自己平时用的服务器一般装centos和debian,偶尔是ubuntu. 桌面li ...
- 模拟器(Nintendo,Genesis,SFC,MD,土星,PS,PS2,PS3,Wii,Xbox等)游戏下载网址
最近想拿个英文游戏复习复习,国内的emu618关闭之后难得寻到很完整的游戏库 通过 https://www.fantasyanime.com/mana/som2downloads.htm 找到 htt ...
- webpack中引用jQuery的四种方式
import webpack中是根据一个入口文件开始收集依赖. import $ from 'jquery' 但是一个项目中通常有很多个地方都用到了jQuery,每个模块都要这样的一行代码 那么如何解 ...
- 【昌哥IT课堂】MySQL8.0新特性之不可见主键
一.概述作为 MySQL DBA ,相信大家都经历过在复制模式下,如果没有主键,遇到 load data ,大事务,ddl 等有大量表数据行扫描的行为时,会带来严重的主从延迟,给数据库稳定性和数据一致 ...