English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 3|回复: 0

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

[复制链接]
查看: 3|回复: 0

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

[复制链接]
查看: 3|回复: 0

363

主题

0

回帖

1099

积分

金牌会员

积分
1099
智能配送设备

363

主题

0

回帖

1099

积分

金牌会员

积分
1099
2025-2-10 09:47:47 | 显示全部楼层 |阅读模式
为什么要避免同步读取

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 请求文本。
这样可以有效地提升应用程序的性能和响应速度,避免因阻塞导致的急剧性性能下降。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

363

主题

0

回帖

1099

积分

金牌会员

积分
1099

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 15:56 , Processed in 1.158407 second(s), 27 queries .

Powered by 智能设备

©2025

|网站地图