[英]Can I add PushStreamContent to MultipartFormDataContent without HttpClient buffering whole request?
我正在嘗試使用MultipartFormDataContent
在HTTP POST中發送一個大文件以及其他一些數據。 為了分塊發送文件,我使用的是PushStreamContent
,它將文件流中的數據塊寫入到輸出流中,每次寫入后都會刷新:
PushStreamContent pushStreamContent = new PushStreamContent((stream, content, context) => {
byte[] buffer = new byte[4096];
int bytesRead;
do {
bytesRead = fileStream.Read(buffer, 0, 4096);
stream.Write(buffer, 0, bytesRead);
stream.Flush();
}
while(bytesRead != 0);
stream.Close();
});
如果我使用以下代碼發布此HttpContent
,則一切正常:
new HttpClient().PostAsync(destinationUrl, pushStreamContent);
但是,如果將此PushStreamContent
添加到MultipartFormDataContent
,則如下所示:
MultipartFormDataContent postForm = new MultipartFormDataContent {
{stringContent, "atom"},
{pushStreamContent, "binary"}
};
和被貼出來,然后我收到OutOfMemoryException
的的拉姆達內PushStreamContent
。 據推測, HttpClient
正在將整個 MultipartFormDataContent
緩沖到內存中,由於請求內容非常大,該操作將失敗。 我希望客戶端PushStreamContent
所包含的PushStreamContent
。 這可能嗎? 我正在使用.NET 4.5。
由於HttpClient
需要知道請求的總長度才能設置Content-Length標頭,因此正在緩沖該請求。 PushStreamContent
對象對於TryComputeLength(out long)
始終返回false 。
因此,解決方案是創建一個不知道其長度的PushStreamContent
子類:
class PushStreamContentWithLength : PushStreamContent {
public PushStreamContentWithLength(Action<Stream, HttpContent, TransportContext> onStreamAvailable, long streamLength) : base(onStreamAvailable) {
mStreamLength = streamLength;
}
readonly long mStreamLength;
protected override bool TryComputeLength(out long length) {
length = mStreamLength;
return true;
}
}
如果將其中之一添加到MultipartFormDataContent
,則在HTTP發布期間將數據推送到流,而不是預先加載到內存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.