0

0

c# ASP.NET Core中的请求处理管道和并发模型

星降

星降

发布时间:2026-03-13 09:55:31

|

789人浏览过

|

来源于php中文网

原创

ASP.NET Core请求处理管道由Middleware按注册顺序串联,通过next.Invoke()传递请求;UseExceptionHandler必须在UseRouting之后才能捕获路由等后续异常;HttpContext仅在InvokeAsync内有效,跨异步阶段需用Items传递数据。

c# asp.net core中的请求处理管道和并发模型

ASP.NET Core请求处理管道是怎么串起来的

请求进来后不是直接进控制器,而是先流经一连串 Middleware。每个中间件决定是否把请求“往下传”,靠的是调用 next.Invoke() —— 不调它,后续中间件和终点(如 Controller)就完全收不到这个请求。

注册顺序就是执行顺序:在 Program.csapp.UseXXX() 的先后,决定了它们在管道中的位置。比如 app.UseAuthentication() 必须在 app.UseAuthorization() 之前,否则 HttpContext.User 还没设好,授权逻辑就拿不到身份信息。

常见误区是把 app.MapControllers() 放太前面。它本质是“最后兜底”的路由分发中间件,一旦放在某个 UseXXX 之前,那些本该拦截或修饰请求的中间件(如日志、CORS、异常处理)就对 API 请求失效了。

并发模型依赖于 .NET 的异步 I/O 和线程池协作

ASP.NET Core 默认不为每个请求独占一个线程。它用 ThreadPool 处理 CPU-bound 工作,但绝大多数请求生命周期(如等待数据库响应、HTTP 调用、文件读写)走的是操作系统级异步 I/O(IOCP),不消耗线程。

这意味着你能轻松支撑数千并发连接,但前提是代码真正异步:所有 async 方法都必须到底层驱动(如 HttpClient.GetAsync()EFCore.SaveChangesAsync()),而不是用 .Result.Wait() 阻塞线程。

  • await 后续代码可能在不同线程上恢复(取决于 SynchronizationContext,但在 ASP.NET Core 中默认无捕获)
  • 不要在 async void 方法里处理请求逻辑 —— 异常会直接崩掉整个应用域
  • 共享状态(如静态变量、HttpContext.Items 以外的全局缓存)必须考虑并发读写,ConcurrentDictionaryDictionary 安全,但也要注意迭代时的快照语义

为什么 UseExceptionHandler 一定要放在 UseRouting 之后

UseExceptionHandler 是个“异常捕获中间件”,但它只对它之后注册的中间件抛出的异常生效。如果它放在 UseRouting 前面,连路由匹配失败(如 404)都捕获不到,因为 UseRouting 自己抛的异常根本不会流经它。

典型错误配置:

Fellou
Fellou

具备主动智能的AI浏览器,被称为世界首个Agentic Browser

下载
app.UseExceptionHandler(); // ❌ 太早,捕获不到路由、认证等环节异常
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(...);

正确顺序:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseExceptionHandler("/error"); // ✅ 在路由之后、终结点之前
app.UseEndpoints(...);

另外注意:/error 路由对应的 endpoint 必须是同步的(或明确标记为 [HttpGet]),否则异常处理自身再抛异常会导致循环崩溃。

中间件里访问 HttpContext 的边界在哪

HttpContext 只在当前请求的中间件执行上下文中有效。一旦离开 InvokeInvokeAsync 方法体,或者把它存到后台任务、静态字段、线程池回调里,大概率会遇到 ObjectDisposedException 或空引用 —— 因为请求生命周期已结束,上下文被释放了。

安全做法:

  • 只在 InvokeAsync 参数中接收并使用 HttpContext
  • 需要跨异步阶段传递数据,用 HttpContext.Items(请求级字典,随请求销毁)
  • 要记录日志或埋点,提取关键字段(如 Request.PathResponse.StatusCode)立即拷贝,别存整个 HttpContext
  • 绝对不要在 Task.Run(() => { /* 访问 HttpContext */ }) 里操作它

最隐蔽的坑是 Entity Framework Core 的 DbContext 实例 —— 它通常注册为 Scoped,生命周期绑定到 HttpContext。一旦你在中间件外启动新线程或 Task,再试图用这个 DbContext,就会触发 InvalidOperationException: Cannot resolve scoped service...

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

183

2024.05.11

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

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

226

2025.12.18

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

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

134

2025.11.27

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

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

765

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

386

2023.06.29

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

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

精品课程

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

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.7万人学习

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

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