Domanda

Sto cercando di scaricare Zend-Framework (da http://framework.zend.com/releases/zendframework-1.11.11/zendframework-1.11.11.zip) semplicemente usando WebClient

string url = "http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip";
WebClient downloader= new WebClient();
downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip");

Il file viene creato, ma è vuoto. Ho controllato la risposta usando Fiddler e ottengo HTTP 200, corretta lunghezza del contenuto ma "connessione: chiusura" e violinista mostrano "-1" nella colonna "corpo".

Ho provato ad aggiungere un agente utente (copiato dalla richiesta di Google Chrome) e "Connection: Keep-Alive" alle intestazioni, ma nessuno di questi ha aiutato. Sono anche abbastanza sicuro che il mio programma abbia scaricato questo file usando lo stesso URL una o due volte prima. Non ci sono errori negli eventi licenziati da WebClient.

Qualche idea?

È stato utile?

Soluzione

Solo la mia ipotesi: forse puoi provare a mantenere l'istanza WebClient in un certo posto non sarebbe raccolta spazzatura. Quando l'evento DownloadFileCompleted ha sparato, si pulisce il riferimento all'istanza di WebClient e lascia che GC recuperi la memoria in seguito (e non dimenticare di chiamare il metodo Disosa).

Altri suggerimenti

Ok, ho trovato Finnaly la risposta! Prima di scaricare il file, stavo controllando le sue dimensioni inviando HTTPWebRequest. Il problema era che non avevo chiuso () la risposta.

Grazie per le risposte, erano bei indizi.

Prova a gestire il DownloadProgressChanged e DownloadFileCompleted evento.

private void button1_Click(object sender, EventArgs e)
  {
   string url = "http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip";
   WebClient downloader = new WebClient();
   downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(downloader_DownloadFileCompleted);
   downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloader_DownloadProgressChanged);
   downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip");
  }

 void downloader_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
   {
      label1.Text = e.BytesReceived + " " + e.ProgressPercentage;
    }
  void downloader_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
   {
       if (e.Error != null)
         MessageBox.Show(e.Error.Message);
       else
         MessageBox.Show("Completed!!!");
   }

Se hai abilitato UAC in Windows "C: temp.Zip" nella riga seguente non salverà il file perché non è consentito scrivere al di fuori delle directory degli utenti senza autorizzazioni elevate:

downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top