为什么要避免同步读取

ASP.NET Core 中的所有 I/O 操作都是异步的。服务器实现了 Stream 接口,该接口同时具备同步和异步的方法。

在进行 I/O 操作时,应优先使用异步方法,以避免阻塞线程池的线程。

如果阻塞了线程池线程,可能会导致服务器无法处理更多请求,造成急剧性性能下降

尤其是当客户端上传速度缓慢时,同步读取将阻塞线程直到整个请求体被全部读取完成。

如何避免同步读取

错误的做法

以下代码示例使用了同步方法 ReadToEnd,导致线程被阻塞:

public class BadStreamReaderController : Controller
{
[HttpGet("/contoso")]
public ActionResult<ContosoData> Get()
{
var json = new StreamReader(Request.Body).ReadToEnd(); return JsonSerializer.Deserialize<ContosoData>(json);
}
}

在这段代码中,Get方法将整个 HTTP 请求体同步读入内存。如果客户端上传速度缓慢,应用程序将阻塞在这个读取操作上,导致效率下降。

正确的做法

使用异步方法 ReadToEndAsync,可以避免阻塞线程:

public class GoodStreamReaderController : Controller
{
[HttpGet("/contoso")]
public async Task<ActionResult<ContosoData>> Get()
{
var json = await new StreamReader(Request.Body).ReadToEndAsync(); return JsonSerializer.Deserialize<ContosoData>(json);
}
}

这段代码使用异步读取方法,在读取过程中不会阻塞线程,可以提升性能和响应速度。

读取表单数据时的注意事项

错误的做法

使用 HttpContext.Request.Form,会在内部执行同步读取,导致线程被阻塞:

public class BadReadController : Controller
{
[HttpPost("/form-body")]
public IActionResult Post()
{
var form = HttpContext.Request.Form; Process(form["id"], form["name"]); return Accepted();
}
}

正确的做法

使用 ReadFormAsync,进行异步读取:

public class GoodReadController : Controller
{
[HttpPost("/form-body")]
public async Task<IActionResult> Post()
{
var form = await HttpContext.Request.ReadFormAsync(); Process(form["id"], form["name"]); return Accepted();
}
}

这种做法使用异步方式读取表单数据,能有效避免阻塞线程池资源。

结论

在 ASP.NET Core 开发中,应符合框架的异步操作模式,避免使用同步方法读取 HTTP 请求文本。

这样可以有效地提升应用程序的性能和响应速度,避免因阻塞导致的急剧性性能下降。

.NET最佳实践:避免同步读取HttpRequest的更多相关文章

  1. java 读取文件最佳实践

    1.  前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...

  2. 转载--JAVA读取文件最佳实践

    1.  前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...

  3. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

    写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 ​ 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  4. 读取生产环境go语言的最佳实践展示

    近期看了一篇关于go产品开发最佳实践的文章,go-in-procution.作者总结了他们在用go开发过程中的非常多实际经验,我们非常多事实上也用到了.鉴于此,这里就简单的写写读后感,兴许我也争取能将 ...

  5. ASP.NET Core 性能优化最佳实践

    本文提供了 ASP.NET Core 的性能最佳实践指南. 译文原文地址:https://docs.microsoft.com/en-us/aspnet/core/performance/perfor ...

  6. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

  7. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  8. 《开源安全运维平台OSSIM最佳实践》

    <开源安全运维平台OSSIM最佳实践> 经多年潜心研究开源技术,历时三年创作的<开源安全运维平台OSSIM最佳实践>一书即将出版.该书用80多万字记录了,作者10多年的IT行业 ...

  9. 基于AWS的云服务架构最佳实践

    ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...

  10. 【转】优化Web程序的最佳实践

    自动排版有点乱,看着蛋疼,建议下载中文PDF版阅读或阅读英文原文. Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了 一系列的实验.开发了各 ...

随机推荐

  1. Java的内存管理1:“并不只有C++程序员关心内存回收”——Java的内存管理2:"不中用的finalize( )方法"

    通常Java的缓存管理会由垃圾回收器(Java Garbage Collection)定时处理,无须程序员操心.但Java Garbage Collection仅有权回收那些非"强引用&qu ...

  2. php调试工具之firePHP

    让PHP可以像js一样利用浏览器的控制台调试代码  ------- FirePHP(http://www.firephp.org/) 1. 安装FirePHP插件 在Chrome浏览器的应用商店中,搜 ...

  3. ZCMU-1179

    我的错误: 明知道是大数问题但不是不想写数组或者字符串的结构. 思路 网上查阅后发现可以使用JAVA的大数类型做. 若不使用JAVA则就是整型数组或者字符串的情况. 将a^b结果放在数组当中,实时更新 ...

  4. 【C++】类的继承的深入探讨

    继承是扩展现有类并为基类提供新功能的一种方式. 本文主要探讨一个问题:子类会包含父类所包含的一切吗? 起初,作者认为这个问题的答案是否定的,因为子类无法访问父类的private成员 但是,运行下述一个 ...

  5. Reverse the Rivers 题解

    原题链接https://codeforces.com/problemset/problem/2036/E (暂时不会弄翻译,所以不上原题了) 说一下我对题意的理解吧 有n个国家,每个国家有k个区域,用 ...

  6. PPT保存报错:某些字体无法与演示文稿一起保存

    WPS做的PPT,用的会员,高级的那种,很高大上很好看,但是用微软的PowerPoint编辑保存,报错:某些字体无法与演示文稿一起保存. 解决方案:移除嵌入的字体 打开演示文稿文件. 在"文 ...

  7. 【Amadeus原创】更改docker run启动参数

    经过一整天的摸索,答案: 没法直接修改.只能另外创建. 但是还好不用完全重头来,用docker commit命令可以基于当前修改的内容创建一个新的image. 执行docker 看看帮助先: Comm ...

  8. Gitbook在Docker中安装插件的方法

    别光在那百度,什么先book.json添加plugin,然后在install? 哥,你现在用的是docker哎,docker都启动不了,你如何gitbook install呢? 乖乖听我的,按我的方法 ...

  9. 还在为入门鸿蒙效率慢而困惑?不妨试试开发学习神器 - AI辅助编程

    鸿蒙应用开发从入门到入行 鸿蒙开发神器 - AI辅助编程 CodeGenie介绍 目前有好几款AI插件可以装到DevEco上,出名的例如Copilot.通义灵码等.但是经过猫林老师截至到目前的测试.都 ...

  10. 中电金信:产教联合共育人才 AFAC2024金融智能创新大赛启动

    当前,人工智能技术正在蓬勃发展,引领着各行各业迈向智能化的新纪元,特别是在金融科技领域,伴随人工智能技术的不断迭代与突破,金融服务的边界也在不断拓展,传统的金融业态正经历着深刻的变革与重塑. 与此同时 ...