2017-02-19 59 views
3

我正在嘗試恢復文件下載。HTTP範圍:帶有WebClient C的字節#

我使用下面的代碼來成功下載我需要的文件。

downlaodfile = new WebClient(); 
    // downlaodfile.Headers.Add("Range", "bytes=0-600000"); 
downlaodfile.DownloadFileAsync(new Uri(video.DownloadUrl), @"C:\Videofile.pm4"); 

的問題開始的時候我去掉波紋線,我得到0字節的下載

downlaodfile.Headers.Add("Range", "bytes=0-600000"); 

什麼是恢復與WebClient類的正確方法?

+0

注意,服務器還必須支持續傳 – Icepickle

回答

1

您的代碼不起作用,因爲您無法像設置它那樣設置Range標頭。爲了驗證只需訂閱DownloadFileCompleted事件並轉儲錯誤:

downlaodfile.DownloadFileCompleted += (sender, e) => 
{ 
    Console.WriteLine(e.Error); 
}; 

你會得到這樣的印刷:

System.Net.WebException: An exception occurred during a WebClient request. ---> System.ArgumentException: The 'Range' header must be modified using the appropriate property or method. 
Parameter name: name 
    at System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName) 
    at System.Net.WebHeaderCollection.Add(String name, String value) 
    at System.Net.HttpWebRequest.set_Headers(WebHeaderCollection value) 
    at System.Net.WebClient.CopyHeadersTo(WebRequest request) 
    at System.Net.WebClient.GetWebRequest(Uri address) 
    at System.Net.WebClient.DownloadFileAsync(Uri address, String fileName, Object userToken) 
    --- End of inner exception stack trace --- 

OK,所以你可能需要一個定製的Web客戶端:

public class WebClientEx : WebClient 
{ 
    private readonly long from; 
    private readonly long to; 

    public WebClientEx(long from, long to) 
    { 
     this.from = from; 
     this.to = to; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.AddRange(this.from, this.to); 
     return request; 
    } 
} 

,你可以這樣使用:

downlaodfile = new WebClientEx(0, 600000); 
downlaodfile.DownloadFileAsync(new Uri(video.DownloadUrl), @"C:\Videofile.pm4"); 

或者乾脆使用HttpWebRequest類,而不是一個WebClient

var request = (HttpWebRequest)WebRequest.Create(video.DownloadUrl); 
request.AddRange(0, 600000); 
using (var response = await request.GetResponseAsync()) 
using (var stream = response.GetResponseStream()) 
using (var output = File.Create(@"C:\Videofile.pm4")) 
{ 
    await stream.CopyToAsync(output); 
} 

或者如果你喜歡用HttpClient

var client = new HttpClient(); 
client.DefaultRequestHeaders.Range = new RangeHeaderValue(0, 600000); 
using (var stream = await client.GetStreamAsync(video.DownloadUrl)) 
using (var output = File.Create(@"C:\Videofile.pm4")) 
{ 
    await stream.CopyToAsync(output); 
} 
+0

謝謝您的建議。我決定轉儲WebClient,並設法使用WebRequest完成Range Byte。順利 –