0

0

c# ASP.NET Core中的 IApplicationBuilder 和 IEndpointRouteBuilder 并发模型

畫卷琴夢

畫卷琴夢

发布时间:2026-01-15 08:59:11

|

292人浏览过

|

来源于php中文网

原创

iapplicationbuilder 和 iendpointroutebuilder 均非线程安全,仅限应用启动时顺序配置;运行时动态路由应使用 dynamicroutevaluetransformer 或自定义 endpointdatasource,而非并发调用 map 方法。

c# asp.net core中的 iapplicationbuilder 和 iendpointroutebuilder 并发模型

ASP.NET Core 中 IApplicationBuilder 不是线程安全的,别在中间件里并发修改它

IApplicationBuilder 是构建请求处理管道的“装配线”,只在应用启动时(Startup.ConfigureProgram.csWebApplication 配置阶段)被顺序调用。它的 UseUseMiddlewareMap 等方法不是为运行时并发调用设计的。

  • 如果在某个中间件内部(比如异步任务中)偷偷调用 app.Use(...),会触发 InvalidOperationException:“Builder is already in use” 或 “The builder has already been built”
  • IApplicationBuilder 内部持有对 RequestDelegate 链的引用,且其 Build() 方法仅执行一次;重复或并发调用会破坏管道一致性
  • 常见误用场景:在健康检查中间件里动态注册新路由、在灰度中间件里根据 Header 注册临时终结点——这些都该移出 IApplicationBuilder 生命周期

IEndpointRouteBuilder 的线程安全性取决于具体实现,但 MapControllers() 等扩展方法不是运行时 API

IEndpointRouteBuilder(如 WebApplication 实现的 EndpointRouteBuilder)本身是线程不安全的,但它通常只在应用初始化阶段被使用。关键在于:所有 MapXxx() 方法(MapControllerRouteMapRazorPagesMapHub)都只是往内部路由表注册终结点描述符(EndpointDataSource),不涉及实时请求分发。

V5SHOP网店系统
V5SHOP网店系统

V5Shop网店系统是上海威博旗下产品之一,一款B to C网上开店软件,适合中小型企业及个人快速构建个性化网上商店。 V5SHOP采用最新的ASP.NET分层技术和AJAX技术,结合微软NET+MSSQL 2005平台运行,并且在开发过程中融入了大量电子商务管理、网络营销和用户体验理念让系统的安全性、稳定性、易用性和实用性都得到了空前的突破,真正达到了只要会打字就能够建设专业水准的电子商务平台。

下载
  • 这些注册操作必须在 app.MapXXX()endpoints.MapXXX() 调用期间完成,不能在 HttpContext.RequestServices 解析出的任意服务中调用
  • 若需运行时动态添加路由(例如插件系统),应通过自定义 EndpointDataSource + IEndpointRouteBuilder 的底层机制实现,而非直接调用 Map 方法
  • MapControllers() 本质是批量扫描程序集并生成 ControllerActionEndpointConventionBuilder,它不检查并发,但也不允许在 Build() 后再调用

真正支持运行时动态路由的是 DynamicRouteValueTransformerEndpointDataSource

如果你需要根据请求上下文(如租户 ID、Header、查询参数)改变路由行为,IApplicationBuilderIEndpointRouteBuilder 都不是目标接口。正确路径是:

  • DynamicRouteValueTransformer 在匹配后动态改写 RouteValueDictionary,它天然支持异步和并发请求
  • 实现自定义 EndpointDataSource 并注入 IServiceCollection,配合后台定时刷新或事件驱动更新终结点集合(注意:更新时需保证 ChangeToken 通知消费者)
  • 避免在 Map 链中嵌套 app.Run(async ctx => { ... }) 并在里面调用 endpoints.MapGet —— 这会导致 InvalidOperationException: Cannot create child container from a resolved service
public class TenantRouteTransformer : DynamicRouteValueTransformer
{
    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        var tenant = httpContext.Request.Headers["X-Tenant"].FirstOrDefault();
        if (!string.IsNullOrEmpty(tenant))
        {
            values["tenant"] = tenant;
        }
        return values;
    }
}

并发模型的本质:ASP.NET Core 的请求处理是 per-request 的,但配置阶段是单次、顺序、不可重入的

整个框架把“配置”和“执行”严格分离:IApplicationBuilderIEndpointRouteBuilder 属于配置期对象,它们的生命周期止于 app.Build();之后所有并发请求都走同一个已构建好的 RequestDelegate 链,由 EndpointRoutingMiddlewareEndpointMiddleware 协同完成路由匹配与执行。

  • 不要试图在 HttpContext 中拿到 IApplicationBuilder 实例 —— 它根本不会被注入到 DI 容器
  • IEndpointRouteBuilder 也不是 Scoped 或 Transient 服务,它只作为 WebApplication 的内部属性存在,无法从 HttpContext.RequestServices 获取
  • 最易忽略的一点:即使你用 WebHostBuilder 手动构建多个 IWebHost,每个实例的 IApplicationBuilder 仍只在其自身启动阶段有效,跨实例共享毫无意义

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

181

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

225

2025.12.18

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1770

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

569

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

43

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

0

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 76万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号