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」を示しています。

ユーザー エージェント (Google Chrome リクエストからコピー) と "connection: keep-alive" をヘッダーに追加しようとしましたが、どれも役に立ちませんでした。また、私のプログラムが同じ URL を使用してこのファイルを 1 回か 2 回ダウンロードしたことも確かです。WebClient によって発生したイベントにエラーはありません。

何か案は?

4

4 に答える 4

2

わかりました、私はついに答えを見つけました!ファイルをダウンロードする前に、HttpWebRequest を送信してサイズを確認していました。問題は、応答を Close() しなかったことです。

答えてくれてありがとう、それらは素晴らしい手がかりでした。

于 2011-12-04T14:51:07.000 に答える
1

私の推測では、WebClientインスタンスをどこかに保持しようとすると、ガベージコレクションが行われない可能性があります。DownloadFileCompletedイベントが発生したら、WebClientインスタンスへの参照をクリーンアップし、GCに後でメモリを再利用させます(Disposeメソッドを呼び出すことを忘れないでください)。

于 2011-12-04T05:17:48.300 に答える
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 に答える