.Net Core 管道底层源码实现

在 .NET Core 中,请求处理管道是一个中间件(Middleware)链,用于处理 HTTP 请求并生成响应。管道的底层实现基于 Microsoft.AspNetCore.Http 命名空间中的一些核心类和接口

1. 核心组件

1.1 HttpContext

  • HttpContext 是 HTTP 请求和响应的核心抽象,封装了请求信息(如请求头、请求体、查询参数等)和响应信息(如状态码、响应头、响应体等)。
  • • 每个请求都会创建一个 HttpContext 实例,并在整个管道中传递。

1.2 HttpRequestHttpResponse

  • HttpRequestHttpResponse 分别表示 HTTP 请求和响应,是 HttpContext 的一部分。
  • HttpRequest 包含请求的详细信息,如路径、方法、头、体等。
  • HttpResponse 用于设置响应的状态码、头、体等。

1.3 RequestDelegate

  • RequestDelegate 是一个委托,表示处理 HTTP 请求的方法:
public delegate Task RequestDelegate(HttpContext context);
  • • 管道中的每个中间件都是一个 RequestDelegate

1.4 Middleware

  • • 中间件是一个类或方法,用于处理请求并调用管道中的下一个中间件。
  • • 中间件通常通过 UseRun 方法注册到管道中。

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 的请求处理机制,并能够灵活地配置和扩展管道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript代码安全性提升:选择和使用JS混淆工具的指南

https://toolin.cn/jsfuckhttps://maimai.cn/article/detail?fid=1827257627&efid=382Pa05uQ_i7jAl6rmq5tg在Web开发中,JavaScript是一种常用的脚本语言,然而,由于其代码容易被他人轻易获取和修改,为了保护JavaScript代码的安全性和版权,我们需要使用JS混淆工具。本文…

AI 驱动研发模式升级,蓝凌软件探索效率提升之道

蓝凌软件在引入通义灵码后取得了较明显的效果。目前,蓝凌软件已使用灵码的开发人员中,周活跃用户占比超过90%、根据代码库自动生成的代码占比超33%、代码智能补全占比29%,代码注释率提升了15%,有效提升了产品代码工程化的效能。深圳市蓝凌软件股份有限公司(以下简称蓝凌软…

“越用越上瘾”,中华财险 60% 研发人员用通义灵码提效

保险业被看成是社会“稳定器”和经济“助推器”,近年来已驶入数字化发展快车道。在 AI、大模型当道的今天,保险行业的研发流程、产品设计、场景拓展等业务链条各环节,都值得用大模型进行重塑。保险业被看成是社会“稳定器”和经济“助推器”,近年来已驶入数字化发展快车道。…

Oracle数据库表空间

SELECT tablespace_name, SUM(BYTES)/1024/1024 "Free Space (MB)" FROM dba_free_space GROUP BY tablespace_name; 追加表空间的语句,里面的路径是服务器的实际路径: ALTER TABLESPACE UNDOTBS1 ADD DATAFILE Z:/app/oradata/MELALEUCADB/UNDOTBS03.DBF SIZE 10…

通义灵码入选南方日报 2024 数字化年度标杆

在数字化浪潮席卷全球的今天,技术创新和智能化转型成为企业发展的关键。在这样的背景下,通义灵码凭借其卓越的性能和创新能力,荣获南方日报2024数字化年度标杆大奖,成为数字化转型领域的佼佼者。在数字化浪潮席卷全球的今天,技术创新和智能化转型成为企业发展的关键。在这…

拿了一个奖:年度高价值技术团队

在数字经济的大背景下,“新质生产力”的要义就在科技创新,目的是实现高质量发展。值得关注的是,“新质生产力”最终落脚点还在生产力,未来主战场仍然是实体产业。与过去不同的是,未来的实体产业发展不再是“单点开花”,而是全产业链的体系化升级。在这个过程中,人工智能…

详解:促销系统整体规划

大家好,我是汤师爷~ 今天聊聊促销系统整体规划。 各类促销活动的系统流程,可以抽象为3大阶段:B端促销活动管理:商家运营人员在后台系统中配置和管理促销活动,包括设定活动基本信息、使用规则、选择适用商品等核心功能。 C端促销活动参与:消费者在前台系统中浏览和参与促销…

AI 助力游戏开发中的常用算法实现

在当今的游戏开发领域,人工智能(AI)技术的应用已经成为推动行业发展的关键力量。AI不仅能够提升游戏的智能化水平,还能够增强玩家的沉浸感和游戏体验。随着技术的进步,AI在游戏设计、开发和测试中的应用越来越广泛,从简单的 NPC 行为模拟到复杂的游戏世界构建,AI技术都在…

win11同时连接网线网络和wifi网络

1.win + R 输入ncpa.cpl 2.选择优先网络,右击属性: 抱怨有用的话还要努力干什么

基于STP文件的智能比对系统:思通数科带来高效机械制造解决方案

在机械制造领域,设计图纸与实物之间的精准对比至关重要,传统的比对方式往往需要耗费大量时间且容易出现错误,导致生产效率低下并影响产品质量。为了解决这些问题,思通数科推出了一套基于STP文件的智能比对系统,结合大模型技术,集成了多项先进功能,如以图搜图、实物比对和…

低轨卫星广泛应用相控阵天线

低轨卫星广泛应用相控阵天线 来源 https://www.ctfiot.com/107783.html蓬勃发展的 GEO 高通量卫星和正在来临的SpaceX、LEOSat、OneWeb 和 鸿雁之类 LEO 卫星星座,正推动着一波卫星通信浪潮。美国航天咨询公司北方天空研究所(NSR) 高级分析师 Brad Grady说,公司预测 2017 到…