2017-02-09 32 views
1

我發現了Python的this answer。它適用於C#WebClient.OpenRead嗎?什麼時候C#Webclient.OpenRead實際下載數據?

在下面的例子:

  1. 不打開讀取下載一次所有的csv文件(因此的ReadLine指當地流)?
  2. 就像在Python中一樣,下載是用連續的ReadLine逐步完成的嗎?

代碼示例

WebClient client = new WebClient(); 
Stream stream = client.OpenRead("http://www.MyWebsite.com/FileToDownload.csv"); 
StreamReader csvFile= new StreamReader(stream); 
while (!csvFile.EndOfStream) 
{ 
    string line = csvFile.ReadLine(); 
    //do stuff with line 
} 
+1

你不是指'新的StreamReader(流)'? – user1859022

+0

查看[源代碼](https://referencesource.microsoft.com/#System/net/System/Net/webclient.cs,ea41c9388029aa78,references),似乎響應一次下載,儘管我我不完全確定(因此只有一條評論)。 – Setsu

+0

當您的StreamReader使用csv文件而不是WebClient時,您正在詢問OpenRead和csv文件。你能否再次審查你的問題? – KernelMode

回答

2

它取決於協議,下載大小與緩衝區大小,甚至可能取決於Web服務器配置。的HttpWebResponse實施,這是在內部使用,讀出了從一個ConnectStream,其能夠解分塊透明:

ConnectStream in reference source

即使在需要解碼或解壓縮的情況下,流被適當地鏈接,所以該實現顯然能夠在不預先在本地下載所有內容的情況下傳輸數據。
但是在實踐中,.NET http棧緩衝區儘可能多地它可以立即,也當你不讀取流結束。這些訊息可能是一個有趣的閱讀:

爲了證明你的情況下,打開Network Tracing,如HttpWebResponse然後將傾倒約相連,延續等。或者利用信息任何其他網絡嗅探工具。確保文件足夠大以查看效果。

嚴格地說,它永遠不會是一個「本地流」,但底層緩衝區將保存比第一次讀取時要求的文件更多(如果不是全部)的請求文件。

0

documentation的HTTP GET請求來判斷的,只要你撥打OpenRead

發送打開一個可讀的流爲從資源下載數據與 指定爲String的URI。

相關問題