簡體   English   中英

是否可以在沒有HttpClient緩沖整個請求的情況下將PushStreamContent添加到MultipartFormDataContent?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM