Загруженный файл с использованием 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!!!");
}