使用webclient.DownloadFileAsync下载的文件有0KB

时间:2011-12-04 04:54:44

标签: c# .net download webclient downloadfileasync

我尝试使用WebClient下载zend-framework(来自http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip

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,正确的内容长度但是"连接:关闭"和提琴手表演" -1" in" body"列。

我尝试添加用户代理(从谷歌浏览器请求中复制)和"连接:keep-alive"标题,但这些都没有帮助。我也很确定,我的程序使用相同的URL下载过一次或两次此文件。 WebClient触发的事件没有错误。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

好的,我终于找到了答案!在下载文件之前,我通过发送HttpWebRequest来检查它的大小。问题是,我没有关闭()响应。

感谢您的回答,他们是很好的线索。

答案 1 :(得分:1)

尝试处理DownloadProgressChangedDownloadFileCompleted事件。

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!!!");
   }

答案 2 :(得分:1)

我的猜测:也许你可以尝试将WebClient实例保留在某个地方不会被垃圾收集。触发DownloadFileCompleted事件时,只需清理对WebClient实例的引用,让GC稍后回收内存(不要忘记调用Dispose方法)。

答案 3 :(得分:1)

如果您在Windows中启用了UAC" C:\ temp.zip"在以下行中将无法保存文件,因为您不允许在没有提升权限的情况下在用户目录之外写入:

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