En utilisant HttpWebRequest pour télécharger les pages html retourne ContentLength comme -1

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

Question

Je suis en train d'obtenir un tas de fichiers HTML téléchargés à partir de l'Internet et en utilisant HttpWebRequest pour le faire.

Cependant, lorsque j'utilise

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

Le HttpWebResponse.ContentLength est toujours -1. Je dois montrer les progrès de ces pages de téléchargement, dans notre version VB6 existante, nous utilisons le contrôle iNet et il rend compte des progrès bien.

Mon code est très similaire à ceci:

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

(La méthode 'Télécharger' qui est)

Je ne sais pas ce que je fais mal ou si son état normal - Theres pas d'en-tête Content-Length envoyé par le serveur web. Comment pouvons-nous entraîner les progrès dans ce cas?

Merci,

Était-ce utile?

La solution

Voici un exemple en utilisant WebClient vous pouvez essayer:

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();
    }
}

Si vous décidez de l'utiliser dans une application WinForms assurez-vous que vous appelez InvokeRequired / Invoke modèle de gestionnaires d'événements car ils ne sont pas exécutées sur le thread d'interface utilisateur.

Autres conseils

Si le serveur Web n'envoie pas une longueur de contenu, il n'y a aucun moyen de savoir combien plus de données il y a, il est pratiquement impossible de savoir à quel point vous êtes à travers elle.

Heck, le serveur peut être générer des données de manière dynamique et toujours sais pas (quand vous obtenez la première partie des données) comment beaucoup plus de données qu'il doit envoyer.

Tout ce qui Réclamations pour montrerez progrès (en proportion de la taille de téléchargement complète) est soit couché, ou télécharge les données d'une manière différente qui ne de leur donner la taille complète. Bien sûr, si vous téléchargez plusieurs fichiers, vous pouvez toujours dire combien de fichiers que vous avez terminé le téléchargement, et combien vous avez encore à télécharger (bien que même dans ce cas, le dernier chiffre peut ne pas être connu si vous faites une application de type chenille).

Notez que l'une approche commune est de montrer une barre de progression qui indique « Je fais des progrès », mais ne cherche pas à deviner combien il reste à télécharger.

Le code de la méthode Télécharger () dans l'article lié repose sur les membres privés de la classe, si bien que

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

compilez, qu'il appelle en fait une méthode sur la class WebRequest, en rejetant le résultat, ce qui est l'endroit où la demande est stocké. Au moment où la ligne

WebRequest.GetResponse();

est appelé, le code a complètement oublié la réponse de Create (). (C # est sensible à la casse, donc WebRequest et webRequest ne sont pas la même chose. Et il est tout à fait classique pour donner le nom webRequest à une instance de la classe WebRequest)

Alors essayez de mettre les lignes

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

en dehors du procédé au sommet de la classe des instances des objets WebRequest et WebResponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top