Mit HTTPWebRequest zum Herunterladen von HTML -Seiten gibt die Inhaltslänge als -1 zurück

StackOverflow https://stackoverflow.com/questions/961383

Frage

Ich versuche, eine Reihe von HTML -Dateien aus dem Internet herunterzuladen und dazu mithilfe von HTTPWebRequest zu tun.

Allerdings, wenn ich benutze

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

Die httpwebresponse.contentLength ist immer -1. Ich muss den Fortschritt dieser Seiten zum Herunterladen zeigen. In unserer vorhandenen VB6 -Version verwenden wir die INET -Steuerung und berichtet über den Fortschritt.

Mein Code ist diesem sehr ähnlich:

http://www.geekpedia.com/tutorial179_creating-a-download-manager-in-csharp.html

(Die "Download" -Methode dh)

Ich bin mir nicht sicher, was ich falsch mache oder ob es normal ist. Wie trainieren wir in diesem Fall den Fortschritt?

Vielen Dank,

War es hilfreich?

Lösung

Hier ist eine Probe verwendet Webclient du könntest es 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 verwenden, stellen Sie sicher, dass Sie anrufen Aufgerufen/Aufrufen Muster von Ereignishandlern, da sie nicht auf dem UI -Thread ausgeführt werden.

Andere Tipps

Wenn der Webserver keine Inhaltslänge sendet, gibt es keine Möglichkeit zu wissen, wie viel mehr Daten vorhanden sind. Im Grunde ist es im Grunde unmöglich zu wissen, wie weit Sie durcheinander sind.

Heck, der Server kann Daten dynamisch generieren und still Nicht wissen (wenn Sie den ersten Teil der Daten erhalten), wie viel mehr Daten sie senden müssen.

Alles was Ansprüche Fortschritt (als Anteil der vollständigen Downloadgröße) zu zeigen, lügt entweder oder lädt die Daten auf eine andere Weise herunter, welche tut Geben Sie ihnen die volle Größe. 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 die letztere Nummer selbst in diesem Fall möglicherweise nicht bekannt ist, wenn Sie dies tun Eine App im Crawler-Stil).

Beachten Sie, dass ein allgemeiner Ansatz darin besteht, eine Fortschrittsleiste anzuzeigen, die "Ich mache Fortschritte" an, versucht aber nicht zu erraten, wie viel zum Download übrig bleibt.

Der Code in der Download () -Methode im verknüpften Artikel beruht auf den privaten Mitgliedern in der Klasse, also obwohl

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

Könnte kompilieren, es wird tatsächlich eine Methode auf dem aufgerufen Klasse WebRequest und dann das Ergebnis verworfen, wo die Anfrage tatsächlich gespeichert wird. Bis zur Linie

WebRequest.GetResponse();

Der Code hat alles über die Antwort von create () vergessen. (C# ist fallsempfindlich, daher sind WebRequest und WebRequest nicht dasselbe; und es ist ziemlich konventionell, dem Namen WebRequest einer Instanz der Webrequest -Klasse zu geben.)

Versuchen Sie also, die Linien zu setzen

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

Außerhalb der Methode oben in der Klasse als Instanzen der WebRequest- und Webresponse -Objekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top