【发布时间】:2015-05-27 06:59:26
【问题描述】:
最近我在 .Net 4.5.1 上使用 HttpClients.PostAsync 时遇到了性能问题。最初服务器(Owin + WebApi)在发送之前缓冲响应。这导致了巨大的内存使用开销(序列化响应大小> 1Gb)。在我打开服务器客户端上的响应流之后,实际上停止了工作。事实证明,原因是从服务器读取响应时客户端上的缓冲区重新分配。我检查了 HttpClient 的实现,在HttpClient.SendAsync 方法中发现了这个有趣的部分:
if (result.Content == null || completionOption == HttpCompletionOption.ResponseHeadersRead)
{
this.SetTaskCompleted(request, linkedCts, tcs, result);
}
else
{
this.StartContentBuffering(request, linkedCts, tcs, result);
}
所以当completionOption 不是ResponseHeadersRead 时,响应总是被缓冲。根据SendAsync documentation 实现的SendAsync 与意图是一致的。
现在,由于 PostAsync 已实现发送 ResponseContentRead,因此响应流始终在 POST 上缓冲。那么问题是为什么 PostAsync 必须等待(和缓冲)整个响应才能在处理继续之前到达?
【问题讨论】:
-
嗨 @koruyucu,我想使用 HttpClient 调用 SOAP Web 服务,因此,我不会使用
PostAsync发送请求,我想知道它是否适用于你要改用SendAsync吗?我问这个是因为 HttpClient 自 2015 年以来发生了变化。谢谢
标签: c# httpclient