为了支持大量的上传(实际上非常大,高达数千兆字节)的文件与进度报告,我们开始使用的HttpClient与PushStreamContent,如所描述here。它的工作原理简单,我们两个流之间复制字节,这里是一个代码示例:的HttpClient抛出OutOfMemory例外时TransferEncodingChunked未设置
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,即使进程的内存消耗不是非常高后引发内存溢出的例外(大约500 MB)。什么固定的这个问题是设置TransferEncodingChunked标志:
request.Headers.TransferEncodingChunked = true;
我们不仅能够转移具有这个标志巨大的文件,内存消耗下降了90%。
我还没有找到任何需要使用TransferEncodingChunked的文档,它更像是一个试验和失败的过程,但在这种情况下似乎很重要。尽管如此,我仍然困惑于为什么抛出异常 - 内存消耗不是很高,是什么原因造成的?
那么,如果数据量很大,最好是将它发送成块,你会发现那令人惊讶吗? – demonplus
我发现这么早就引起了令人惊讶的OutOfMemory异常。 –