2013-11-02 44 views
0

這裏是我的代碼:無法建立多個連接,下載文件在C#

public static Stream CreateLink(Uri path, int start, int end) 
     { 
      HttpWebResponse response; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path); 
      request.Timeout = 30000; 
      request.AddRange(start, end); 
      try 
      { 
       response = (HttpWebResponse)request.GetResponse(); 
      } 
      catch 
      { 
       response = null; 
      } 
      if (response != null) 
      { 
       var stream = response.GetResponseStream(); 
       return stream; 
      } 
      return null; 
     } 

我創建多個連接在同個stream.However並行下載數據,它是一次返回流和返回null在所有後續嘗試中,直到第一個返回的流被關閉。
此外,Stream支持Accept-Rangesbytes
所以,我的問題是我怎麼能做多個連接或在我的上面的代碼中是錯誤的?


更新:
response設置爲null由於超時異常或不準確的反應越來越直至以前的連接(響應流)被關閉。

+1

'我創建了多個連接來並行下載數據到底在哪裏?我沒有在你的代碼中看到它。 – PoweredByOrange

+0

我在多線程上調用'CreateLink()'並從並行下載返回的流 – userda

回答

0

好像大多數時候,你不會得到在HttpWebRequest的長度,這就是爲什麼試圖運行代碼時,你會得到這樣的例外:

This stream does not support seek operations.

和:

'debug.Position' threw an exception of type 'System.NotSupportedException'

看一看this回答更多細節:)

編輯: 我不知道你是如何調用你的代碼,並從那裏,但如果你是在一個正常的程序(串行)的方式做,例如:

for (int i =0; i<10; i++) { 
    var some_var = CreateLink(path, i*100,(i+1)*100) 
} 

然後顯然會調用這個方法,等到它獲得前100個(或者你設置的任何東西)字節,然後再調用它。

+0

我沒有得到這樣的異常,因爲我沒有使用seek操作。我只是得到超時異常,或者恰恰我無法創建多個一次有效連接。 – userda

+0

另外作爲備註:我有長度,否則我不會有開始和結束 – userda

+0

這是我嘗試你的代碼時得到的錯誤,你能給我你正在使用的鏈接嗎? – Noctis

0

.NET Framework 4/4.5內置了優化的異步HttpClient類。您可以使用它們來實現您希望從HTTP獲得的幾乎所有內容。這裏是你需要的全部:

var responseMessage = await (new HttpClient().GetAsync("http://download.linnrecords.com/test/flac/recit24bit.aspx", HttpCompletionOption.ResponseHeadersRead)); 
if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK) 
{ 
    var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test_http_download.flac"); 
    using (var fileStream = File.Create(filePath)) 
    using (var httpStream = await responseMessage.Content.ReadAsStreamAsync()) 
    { 
     httpStream.CopyTo(fileStream); 
     fileStream.Flush(); 
    } 
    Process.Start(filePath); 
}