Domanda

Sto cercando di scaricare un sacco di file HTML da Internet e di utilizzare HttpWebRequest per farlo.

Tuttavia quando uso

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

HttpWebResponse.ContentLength è sempre -1.Devo mostrare l'avanzamento del download di queste pagine, nella nostra versione VB6 esistente utilizziamo il controllo inet e riporta bene l'avanzamento.

Il mio codice è molto simile a questo:

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

(Il metodo 'Download' cioè)

Non sono sicuro di cosa sto facendo di sbagliato o se è normale: non esiste alcuna intestazione Content-Length inviata dal server web.Come alleniamo i progressi in questo caso?

Grazie,

È stato utile?

Soluzione

Ecco un esempio utilizzando WebClient si potrebbe provare:

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

Se si decide di utilizzare in un'applicazione WinForms assicuratevi di chiamare InvokeRequired / Invoke modello da gestori di eventi in quanto non sono eseguite sul thread UI.

Altri suggerimenti

Se il server Web non invia una lunghezza del contenuto, non c'è modo di sapere quanto più dati c'è, quindi è praticamente impossibile sapere quanto attraverso di esso si trovi.

Heck, il server può essere genera i dati in modo dinamico e ancora non sa (quando si ottiene la prima parte dei dati) quanti più dati si deve inviare.

Tutto ciò che richieste per essere mostrando corso (come percentuale del formato completo download) è o mentendo o sta scaricando i dati in un modo diverso, che fa dare loro il full size. Naturalmente, se si sta scaricando più file si può sempre dire quanti file avete finito di scaricare e quanti hai ancora avuto modo di scaricare (sebbene anche in questo caso il numero di quest'ultima non può essere conosciuto se si sta facendo un'applicazione crawler in stile).

Si noti che un approccio comune è quello di mostrare una barra di avanzamento che indica "Sto facendo progressi", ma non cerca di indovinare quanto è rimasto per scaricare.

Il codice nel metodo Download() nell'articolo collegato si basa sui membri privati ​​della classe, quindi anche se

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

potrebbe compilare, in realtà sta chiamando un metodo su classe WebRequest, scartando quindi il risultato, ovvero il luogo in cui viene effettivamente archiviata la richiesta.Per il momento la linea

WebRequest.GetResponse();

viene chiamato, il codice ha dimenticato completamente la risposta di Create().(C# fa distinzione tra maiuscole e minuscole, quindi WebRequest e webRequest non sono la stessa cosa;ed è abbastanza convenzionale dare il nome webRequest a un'istanza della classe WebRequest.)

Quindi prova a mettere le linee

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

all'esterno del metodo nella parte superiore della classe come istanze degli oggetti WebRequest e WebResponse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top