Загруженный файл с использованием webclient.DownloadFileAsync имеет 0 КБ

Я пытаюсь загрузить Zend-Framework (с http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip) просто с помощью 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");

Файл создан, но он пуст. Я проверил ответ, используя fiddler, и получил HTTP 200, правильную длину содержимого, но "connection: closed", и fiddler показывает "-1" в столбце "body".

Я попытался добавить пользовательский агент (скопированный из запроса Google Chrome) и "connection: keep-alive" к заголовкам, но ни один из них не помог. Я также почти уверен, что моя программа загружала этот файл один и тот же URL один или два раза раньше. В событиях, запускаемых WebClient, ошибок нет.

Есть идеи?

4 ответа

Решение

Просто мое предположение: возможно, вы можете попытаться сохранить экземпляр WebClient в каком-то месте, где не будет мусора. Когда событие DownloadFileCompleted сработало, вы просто очищаете ссылку на экземпляр WebClient и позволяете GC позже восстановить память (и не забудьте вызвать метод Dispose).

Хорошо, я наконец нашел ответ! Перед загрузкой файла я проверял его размер, отправляя HttpWebRequest. Проблема заключалась в том, что я не закрыл () ответ.

Спасибо за ответы, они были хорошими подсказками.

Если в Windows включен контроль учетных записей "C:\temp.zip", то в следующей строке не удастся сохранить файл, поскольку вы не можете писать вне пользовательских каталогов без повышенных разрешений:

downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip");

Попробуйте справиться с DownloadProgressChanged а также DownloadFileCompleted событие.

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!!!");
   }
Другие вопросы по тегам