0

我正在尝试使用 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");

该文件已创建,但它是空的。我使用提琴手检查了响应,我得到了 HTTP 200,内容长度正确,但“连接:关闭”,提琴手在“正文”列中显示“-1”。

我尝试将用户代理(从谷歌浏览器请求复制)和“连接:保持活动”添加到标题,但这些都没有帮助。我也很确定,我的程序之前使用相同的 URL 下载过这个文件一两次。WebClient 触发的事件中没有错误。

有任何想法吗?

4

4 回答 4

2

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

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

于 2011-12-04T14:51:07.000 回答
1

尝试处理DownloadProgressChangedandDownloadFileCompleted事件。

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!!!");
   }
于 2011-12-04T05:06:07.200 回答
1

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

于 2011-12-04T05:17:48.300 回答
1

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

downloader.DownloadFileAsync(new Uri(url), "C:\\temp.zip");
于 2014-11-07T13:08:07.733 回答