Ошибка загрузки AsyncData для WebClient - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть URL в формате http://ww.url.com/page?id=200. Это позволит загрузить файл размером 10 МБ. Однако я получаю e.ProgressPercentage как 0 всегда. но он загружает функцию «Готово» с фактическим показанием результатов.

Пожалуйста, скажите мне, что я делаю здесь неправильно.

Я использую следующий код

private void button1_Click(object
    sender, EventArgs e)
{

    WebClient webClient = new WebClientEx();

    webClient.DownloadProgressChanged +=
        new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

    webClient.DownloadDataCompleted += new
        DownloadDataCompletedEventHandler(wc_DownloadComplete);

    webClient.DownloadDataAsync(new Uri("http://ww.url.com/page?id=200"));


}

public void wc_DownloadProgressChanged(Object sender, 
    DownloadProgressChangedEventArgs e)

{
    Progress1.Value = e.ProgressPercentage; // this is 0
}

public void wc_DownloadComplete(Object sender,DownloadDataCompletedEventArgs e)

{
    int a = 0;
    this.Close();
}
} }

1 Ответ

0 голосов
/ 18 декабря 2010

ProgressPercentage основан на ContentLength, возвращенном в заголовке ответа. Если ответ не знает, насколько большой будет загрузка, когда он собирает заголовок, вы не сможете получить прогресс.

Если бы это был просто файл, возвращенный IIS, IIS получил бы размер файла из файловой системы и установил для вас заголовок. Если ответ является динамическим и вписывается в буфер, длина ответа может быть установлена. Однако я вполне уверен, что размер буфера по умолчанию составляет менее 10 МБ, поэтому заголовок ответа отправляется обратно клиенту до того, как станет известна длина ответа.

В Asp.Net вы бы это сделали (в зависимости от вашей платформы это зависит от вашей платформы) ...

Response.AddHeader("Content-Length", "10485760");
...