爲了支持大量的上傳(實際上非常大,高達數千兆字節)的文件與進度報告,我們開始使用的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異常。 –