【发布时间】:2017-02-19 18:50:22
【问题描述】:
为了支持上传带有进度报告的大型(实际上非常大,最多几 GB)文件,我们开始使用带有 PushStreamContent 的 HttpClient,如 here 所述。它工作简单,我们在两个流之间复制字节,这是一个代码示例:
private void PushContent(Stream src, Stream dest, int length)
{
const int bufferLength = 1024*1024*10;
var buffer = new byte[bufferLength];
var pos = 0;
while (pos < length)
{
var bytes = Math.Min(bufferLength, length - pos);
src.Read(buffer, 0, bytes);
dest.Write(buffer, 0, bytes);
pos += bufferLength;
dest.Flush();
Console.WriteLine($"Transferred {pos} bytes");
}
dest.Close();
}
但一开始这段代码在传输 320 MB 后引发了 OutOfMemory 异常,即使进程的内存消耗不是很高(大约 500 MB)。解决此问题的方法是设置 TransferEncodingChunked 标志:
request.Headers.TransferEncodingChunked = true;
我们不仅可以通过设置这个标志传输大文件,内存消耗减少了 90%。
我没有找到任何需要使用 TransferEncodingChunked 的文档,这更像是一个试验和失败的过程,但在这种情况下它似乎至关重要。我仍然很困惑为什么会抛出异常 - 内存消耗不是很高,是什么原因造成的?
【问题讨论】:
-
好吧,如果数据很大,最好分块发送,你觉得奇怪吗?
-
我发现这么早就提出了令人惊讶的 OutOfMemory 异常。
标签: c# upload httpclient large-files