【问题标题】:Downloaded file using webclient.DownloadFileAsync has 0KB使用 webclient.DownloadFileAsync 下载的文件有 0KB
【发布时间】:2011-12-04 04:54:43
【问题描述】:

我正在尝试使用 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 触发的事件没有错误。

有什么想法吗?

【问题讨论】:

    标签: c# .net download webclient downloadfileasync


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢以同样的方式解决了我的问题。只是将网络响应包装在 using 语句中,它解决了我的问题。我在下载之前检查了文件名,我正在使用 httpwebrequest 来获取 contentDisposition 标头。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      尝试处理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!!!");
         }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-03
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多