ToB企服应用市场:ToB评测及商务社交产业平台

标题: .NET最佳实践:避免同步读取HttpRequest [打印本页]

作者: 滴水恩情    时间: 2025-2-12 16:03
标题: .NET最佳实践:避免同步读取HttpRequest
为什么要避免同步读取

ASP.NET Core 中的全部 I/O 操纵都是异步的。服务器实现了 Stream 接口,该接口同时具备同步和异步的方法。
在举行 I/O 操纵时,应优先使用异步方法,以避免阻塞线程池的线程。
假如阻塞了线程池线程,可能会导致服务器无法处理更多哀求,造成急剧性性能下降
尤其是当客户端上传速率缓慢时,同步读取将阻塞线程直到整个哀求体被全部读取完成。
如何避免同步读取

错误的做法
以下代码示例使用了同步方法 ReadToEnd,导致线程被阻塞:
  1. public class BadStreamReaderController : Controller
  2. {
  3.     [HttpGet("/contoso")]
  4.     public ActionResult<ContosoData> Get()
  5.     {
  6.         var json = new StreamReader(Request.Body).ReadToEnd();
  7.         return JsonSerializer.Deserialize<ContosoData>(json);
  8.     }
  9. }
复制代码
在这段代码中,Get方法将整个 HTTP 哀求体同步读入内存。假如客户端上传速率缓慢,应用步伐将阻塞在这个读取操纵上,导致服从下降。
正确的做法
使用异步方法 ReadToEndAsync,可以避免阻塞线程:
  1. public class GoodStreamReaderController : Controller
  2. {
  3.     [HttpGet("/contoso")]
  4.     public async Task<ActionResult<ContosoData>> Get()
  5.     {
  6.         var json = await new StreamReader(Request.Body).ReadToEndAsync();
  7.         return JsonSerializer.Deserialize<ContosoData>(json);
  8.     }
  9. }
复制代码
这段代码使用异步读取方法,在读取过程中不会阻塞线程,可以提升性能和响应速率。
读取表单数据时的注意事项

错误的做法
使用 HttpContext.Request.Form,会在内部执行同步读取,导致线程被阻塞:
  1. public class BadReadController : Controller
  2. {
  3.     [HttpPost("/form-body")]
  4.     public IActionResult Post()
  5.     {
  6.         var form = HttpContext.Request.Form;
  7.         Process(form["id"], form["name"]);
  8.         return Accepted();
  9.     }
  10. }
复制代码
正确的做法
使用 ReadFormAsync,举行异步读取:
  1. public class GoodReadController : Controller
  2. {
  3.     [HttpPost("/form-body")]
  4.     public async Task<IActionResult> Post()
  5.     {
  6.         var form = await HttpContext.Request.ReadFormAsync();
  7.         Process(form["id"], form["name"]);
  8.         return Accepted();
  9.     }
  10. }
复制代码
这种做法使用异步方式读取表单数据,能有用避免阻塞线程池资源。
结论

在 ASP.NET Core 开辟中,应符合框架的异步操纵模式,避免使用同步方法读取 HTTP 哀求文本。
如许可以有用地提升应用步伐的性能和响应速率,避免因阻塞导致的急剧性性能下降。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4