2009-06-07 4 views
0

Ich versuche, eine Reihe von HTML-Dateien aus dem Internet heruntergeladen und mit HttpWebRequest zu tun.Verwenden von HttpWebRequest zum Download von HTML-Seiten gibt ContentLength als -1

Jedoch, wenn ich

WebRequest.Create verwenden ("http://www.stackoverflow.com/"); WebRequest.GetResponse();

Die HttpWebResponse.ContentLength ist immer -1. Ich muss den Fortschritt des Herunterladens dieser Seiten zeigen, in unserer bestehenden VB6-Version verwenden wir das inet-Steuerelement und es zeigt den Fortschritt an.

Mein Code ist sehr ähnlich wie diese:

http://www.geekpedia.com/tutorial179_Creating-a-download-manager-in-Csharp.html

(Die Methode ‚Download‘, das ist)

Ich bin nicht sicher, was ich falsch mache, oder ob seine normale - Es gibt keinen Content-Length-Header, der vom Web-Server gesendet wird. Wie trainieren wir den Fortschritt in diesem Fall?

Danke,

Antwort

1

Hier ist eine Probe WebClient verwenden Sie könnten versuchen:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var client = new WebClient(); 
     client.DownloadProgressChanged += (sender, e) => 
     { 
      Console.WriteLine("{0}% completed", e.ProgressPercentage); 
     }; 
     client.DownloadStringCompleted += (sender, e) => 
     { 
      // e.Result contains downloaded string 
      Console.WriteLine("finished downloading..."); 
     }; 
     client.DownloadStringAsync(new Uri("http://www.stackoverflow.com")); 
     Console.ReadKey(); 
    } 
} 

Wenn Sie es in einer WinForms-Anwendung zu verwenden, stellen Sie sicher, InvokeRequired/Invoke Muster von Event-Handler aufrufen, da sie nicht auf dem UI-Thread ausgeführt werden, .

+0

Danke für das Beispiel. Einige Server zeigen Fortschritte, die andere nicht machen, ich sehe, dass nicht viel getan werden kann :( –

0

Der Code im Download() -Methode in dem verlinkten Artikel stützt sich auf den privaten Mitgliedern in der Klasse, so dass, obwohl

WebRequest.Create("http://www.stackoverflow.com");

kompilieren könnte es auf dem eine Methode tatsächlich rief Klasse WebRequest, dann verwerfen das Ergebnis, wo die Anfrage tatsächlich gespeichert ist. Wenn die Zeile

WebRequest.GetResponse();

aufgerufen wird, hat der Code alles über die Antwort von Create() vergessen. (C# ist empfindlich Fall, so WebRequest und webRequest sind nicht dasselbe, und es ist durchaus üblich, den Namen webRequest auf eine Instanz der Klasse WebRequest zu geben.)

So versuchen, die Linien setzen

 
private HttpWebRequest webRequest; 
private HttpWebResponse webResponse; 

außerhalb der Methode an der Spitze der Klasse als Instanzen der WebRequest- und WebResponse-Objekte.

1

Wenn der Web-Server keine Inhaltslänge sendet, gibt es keine Möglichkeit zu wissen, wie viel mehr Daten vorhanden sind. Es ist also im Grunde unmöglich zu wissen, wie weit es durch Sie hindurch ist.

Heck, der Server kann Daten dynamisch generieren und immer noch nicht wissen (wenn Sie den ersten Teil der Daten erhalten), wie viel mehr Daten es gesendet werden muss.

Alles, was Ansprüche werden Fortschritt (als Anteil an der vollständigen Download-Größe) zeigen, ist entweder liegend, oder die Daten in einer anderen Art und Weise der Herunterladen, die hat ihr die volle Größe geben. Natürlich, wenn Sie mehrere Dateien herunterladen, können Sie immer sagen, wie viele Dateien Sie heruntergeladen haben und wie viele Sie noch herunterladen müssen (obwohl auch in diesem Fall die letztere Nummer möglicherweise nicht bekannt ist, wenn Sie es tun eine Crawler-ähnliche App).

Beachten Sie, dass ein gängiger Ansatz darin besteht, einen Fortschrittsbalken anzuzeigen, der anzeigt, dass "ich Fortschritte mache", aber nicht versucht zu erraten, wie viel noch heruntergeladen werden muss.

+0

Ah total verstanden. Danke für die Erklärung :-) –

Verwandte Themen