Cálculo de bytes totales para descargar usando WebClient ()

La variable ‘totalBytes’ está constantemente en -1, por lo que no puedo calcular / actualizar correctamente la barra de progreso, ¿por qué sucedería esto?

private void button1_Click(object sender, EventArgs e) { WebClient client = new WebClient(); client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); client.DownloadFileAsync(new Uri("http://example.com/test.mp3"), @"E:\Test.mp3"); } private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { double bytesIn = double.Parse(e.BytesReceived.ToString()); label1.Text = Convert.ToString(bytesIn); double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); //stays at -1 label2.Text = Convert.ToString(totalBytes); double percentage = bytesIn / totalBytes * 100; label3.Text = Convert.ToString(percentage); progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString()); } 

Un WebClient usa una WebRequest internamente, y el problema es probable que el servidor del que está descargando el archivo no esté enviando el encabezado HTTP Content-Length , en cuyo caso debe usar un estilo de Indeterminate progreso Indeterminate (por ejemplo, Marquee).

Puede verificar manualmente la longitud del contenido en los encabezados de respuesta

 client.ResponseHeaders["Content-Length"]