LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

.NET最佳实践:避免同步读取HttpRequest

admin
2025年2月10日 8:49 本文热度 257

为什么要避免同步读取

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<IActionResultPost()    {        var form = await HttpContext.Request.ReadFormAsync();
        Process(form["id"], form["name"]);
        return Accepted();    }}

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


结论

在 ASP.NET Core 开发中,应避免使用同步方法读取 HTTP 请求文本。

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


该文章在 2025/2/10 10:16:48 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved