2017-06-11 2 views
0

Mein Ziel ist das Herunterladen einige Datei fortzusetzen, nachdem ein Download wird von dem Start neueste geschriebenen Bytes angehalten worden und nicht von 0. habe ich bereits hinzugefügt AddRange Header in meine benutzerdefinierten Klasse (die wie erwartet funktioniert), aber DownloadFileAsync überschreibt standardmäßig meine heruntergeladene Datei und erstellt sie von Grund auf neu.Ist es möglich, DownloadFileAsync vom WebClient C# zu überschreiben, um die heruntergeladene Datei nicht zu überschreiben/ersetzen?

Hier ist meine eigene Klasse:

public class CookieAwareWebClient : WebClient 
{ 
    private class CookieContainer 
    { 
     Dictionary<string, string> _cookies; 

     public string this[Uri url] 
     { 
      get 
      { 
       if (_cookies.TryGetValue(url.Host, out string cookie)) 
        return cookie; 

       return null; 
      } 
      set 
      { 
       _cookies[url.Host] = value; 
      } 
     } 

     public CookieContainer() 
     { 
      _cookies = new Dictionary<string, string>(); 
     } 
    } 

    private CookieContainer cookies; 

    private readonly long from; 
    private readonly long to; 

    public CookieAwareWebClient(long from, long to) : base() 
    { 
     cookies = new CookieContainer(); 
     this.from = from; 
     this.to = to; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 

     if (request is HttpWebRequest) 
     { 
      string cookie = cookies[address]; 
      if (cookie != null) 
       ((HttpWebRequest)request).Headers.Set("cookie", cookie); 

      if (from != 0 || to != 0) 
      { 
       ((HttpWebRequest)request).AddRange(from, to); 
      } 
     } 

     return request; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) 
    { 
     WebResponse response = base.GetWebResponse(request, result); 

     string[] cookies = response.Headers.GetValues("Set-Cookie"); 
     if (cookies != null && cookies.Length > 0) 
     { 
      string cookie = ""; 
      foreach (string c in cookies) 
       cookie += c; 

      this.cookies[response.ResponseUri] = cookie; 
     } 

     return response; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse response = base.GetWebResponse(request); 

     string[] cookies = response.Headers.GetValues("Set-Cookie"); 
     if (cookies != null && cookies.Length > 0) 
     { 
      string cookie = ""; 
      foreach (string c in cookies) 
       cookie += c; 

      this.cookies[response.ResponseUri] = cookie; 
     } 

     return response; 
    } 
} 

Antwort

0

DownloadFileAsync nicht virtuell ist, so dass Sie es nicht außer Kraft setzen kann.

WebClient.DownloadFileAsync Methode ist eine bequeme Möglichkeit, eine Datei vom Netzwerkspeicherort herunterladen, akzeptiert einfach eine URL und einen lokalen Pfad und erledigt den Job. Die Anforderung von pause-and-resume gehört nicht zum Umfang dieser API. Sie müssen einen Code schreiben, der aus dem Antwortstream gelesen werden soll, und in den Dateistream schreiben (den Sie im Append-Modus aus der vorhandenen Datei öffnen).

+0

Ist es möglich, ein Beispiel mit einer solchen Methode für Webclient.DownloadFileAsync bereitzustellen? (Ich möchte vermeiden, den gesamten Code zu httpwebrequest zu ändern) – Supreme

+0

Sie können eine neue Methode wie 'DownloadFileWithRange' zu ​​Ihrer benutzerdefinierten Klasse hinzufügen, ich finde ein Beispiel [von hier] (https://www.codeproject.com/Tips/307548/ Resume-Suppoert-Downloading). Sie müssen den Bereich (von, bis) nicht explizit festlegen, da der Code die Inhaltslänge der Netzwerkressource und die Dateilänge der lokalen Datei erkennen und den Bereich für Sie berechnen kann. – kennyzx

+0

Funktioniert nicht mit meinen gesendeten Token. – Supreme

Verwandte Themen