2011-12-04 51 views
0

我想下載的Zend框架(從http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip)簡單地使用Web客戶端下載的文件有0KB

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」。

我已經嘗試添加用戶代理(從谷歌瀏覽器請求複製)和「連接:保持活着」頭,但沒有一個幫助。我也很確定,我的程序使用同一個URL下載此文件一次或兩次。 WebClient觸發的事件中沒有錯誤。

任何想法?

回答

1

只是我的猜測:也許你可以嘗試保持WebClient實例在某個地方不會被垃圾收集。當DownloadFileCompleted事件觸發時,您只需清除對WebClient實例的引用,並讓GC稍後回收內存(並且不要忘記調用Dispose方法)。

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

好吧,我finnaly找到答案!在下載文件之前,我正在通過發送HttpWebRequest來檢查它的大小。問題是,我沒有關閉()響應。

感謝您的回答,他們是很好的線索。

+0

請添加您的代碼。我也面臨同樣的問題 –

+0

謝謝解決我的問題相同的方式。只是在使用聲明中包裝了Web響應,並解決了我的問題。我在下載文件之前檢查文件名,並使用httpwebrequest獲取contentDisposition頭文件。 –

1

如果您有Windows的「C:\ temp.zip」啓用UAC在下面一行將無法保存文件,因爲你不能沒有提升的權限之外編寫用戶目錄:

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