0

0

c# 如何在ASP.NET Core中间件中使用异步

星降

星降

发布时间:2026-02-03 08:03:56

|

703人浏览过

|

来源于php中文网

原创

ASP.NET Core中间件必须正确使用async/await:委托签名要求返回Task,async方法须await所有异步操作(含next()),避免阻塞、空响应或异常逃逸;禁用Task.Run包装同步I/O,应使用原生异步API,并确保异常处理覆盖await next()。

c# 如何在asp.net core中间件中使用异步

ASP.NET Core中间件中必须用 async + await,不能只写 async 方法但同步调用

中间件委托签名是 Func,返回类型必须是 Task。如果方法声明为 async Task 却没用 await,编译器会警告,运行时可能阻塞线程或丢弃未等待的 Task

  • 错误写法:
    app.Use(async (context, next) =>
    {
        SomeAsyncOperation(); // 忘了 await → 返回 void,中间件立即往下走
        await next();
    });
  • 正确写法:
    app.Use(async (context, next) =>
    {
        await SomeAsyncOperation(); // 真正 await
        await next();
    });
  • 若异步操作无依赖后续逻辑,可用 ConfigureAwait(false) 避免上下文捕获(尤其在非 UI 场景)

next() 本身必须 await,否则请求流程中断

next() 是下一个中间件的入口,它返回 Task。不 await 它会导致当前中间件“假性完成”,后续中间件可能没执行,响应也可能提前结束或空内容。

  • 典型现象:HTTP 200 状态码返回,但响应体为空,或日志显示 next() 后的代码已执行,但浏览器收不到数据
  • 即使你只做日志或监控,也得 await next(),否则请求生命周期被截断
  • 想在下游执行完后补逻辑?把代码放在 await next() 后面即可:
    app.Use(async (context, next) =>
    {
        var sw = Stopwatch.StartNew();
        await next(); // 等下游全部跑完
        sw.Stop();
        _logger.LogInformation("Total time: {Elapsed}", sw.ElapsedMilliseconds);
    });

避免在中间件里用 Task.Run 包装同步 I/O 操作

有人误以为“加个 Task.Run 就是异步”,但在 ASP.NET Core 中,这反而增加线程调度开销,还可能耗尽线程池。真正的异步应来自底层支持(如 Stream.ReadAsyncHttpClient.GetAsync、EF Core 的 ToListAsync)。

通吃客零食网整站 for Shopex
通吃客零食网整站 for Shopex

第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho

下载
  • 反模式:
    app.Use(async (context, next) =>
    {
        await Task.Run(() => {
            var data = File.ReadAllText("config.json"); // 同步读文件 → 假异步
        });
        await next();
    });
  • 正解:改用真正异步 API:
    await using var stream = File.OpenRead("config.json");
    using var reader = new StreamReader(stream);
    var content = await reader.ReadToEndAsync();
  • 注意:File.ReadAllTextAsync 在 .NET 6+ 才有;旧版本需手动构造 FileStream + StreamReader

异常处理要覆盖整个 await 链,别漏掉 next()

中间件里 try/catch 只包自己代码,不包 await next(),那下游抛的异常就逃逸出去了,可能触发全局 500 且没日志。

  • 常见疏忽:
    try
    {
        await DoSomethingAsync();
        // 忘了把 await next() 放进 try 块!
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Failed in middleware");
    }
  • 安全写法:
    try
    {
        await DoSomethingAsync();
        await next(); // 这句也要在 try 内
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Middleware failed");
        throw; // 或写响应,但别静默吞掉
    }
  • 更推荐用全局异常处理中间件(UseExceptionHandler),但自定义中间件内仍需确保 await next() 不裸奔
中间件异步的核心就一条:所有 Task 返回值的操作,只要语义上需要等它完成,就必须 await——包括你自己的调用,也包括 next()。漏掉任何一个,都可能让请求流断裂、资源泄漏或行为不可预测。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

178

2024.05.11

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

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

217

2025.12.18

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

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

568

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

438

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

422

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2520

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2213

2024.08.16

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

24

2026.02.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.7万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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