2017-10-21 210 views
0

我正在編寫一個組件來從HTTP服務傳輸大(4 + GB)。該組件採用URL和目標流。目標流可能是一個文件流,或者它可能是一個流向不同的HTTP服務或甚至兩者。由於我的組件的作者,我需要做的這些步驟,直到我做:從http服務傳輸大文件

  1. 從HTTP流中讀取一個合理大小的緩衝區,
  2. 寫這個緩衝區目的流,
  3. 刷新目標流(輸出到磁盤,網絡等)

我應該永遠不會超過內存中數據緩衝區的大小。

我使用flurl使我的HTTP調用到服務器。我嘗試以下方法,使我的電話

var stream = await flurlClient.GetStreamAsync(); 

這給我回一個MemoryStream,因爲它會填滿,並採取了儘可能多的內存文件的大小,這是行不通的。

var response = flurlClient.GetAsync(); 
var stream = response.Content.ReadAsStreamAsync(); 

再次,一個內存流。

var response = flurlClient.GetAsync(); 
var stream = new CustomFlushingSteam(); 
response.Content.CopyToAsync(stream); 

這一個看起來很有希望,但很可惜,它試圖利用單個寫寫()語句整個事情。

我怎樣才能完成這項任務,而不會浪費我的記憶?我更喜歡使用flurl,但我並沒有與它聯繫在一起。

+0

Flurl會讓你訪問底層的'NetworkStream'嗎?如果沒有,它不適用於這 –

回答

1

做一些挖後,我發現下面的代碼解決了我的問題:

var response = flurlClient.SendAsync(
    HttpMethod.Get, null, null, HttpCompletionOption.ResponseHeadersRead); 
var stream = response.Content.ReadAsStreamAsync(); 

在這種情況下,回來不再是一個內存流,但網絡流流。

+0

是的,這就是你想要做的。 Flurl的[DownloadFileAsync](https://github.com/tmenier/Flurl/blob/master/src/Flurl.Http/DownloadExtensions.cs#L24)在內部就是這樣。 –

相關問題