2012-08-08 206 views
1

我需要下載一個從web服務實時創建的zip文件。 讓我解釋一下。 我正在開發一個使用SoapXml webservice的web應用程序。 Web服務中有導出功能,它返回一個臨時URL來下載文件。在請求下載時,服務器創建該文件並在幾秒鐘後將其提供下載。 我試圖使用等待下載完成

webClient.DownloadFile(URL,@ 「C:/等../」)

此功能下載該文件並將其保存0KB給我。太快了!服務器沒有時間創建文件。我也試圖把

webClient.OpenRead(url); 
System.Threading.Thread.Sleep(7000); 
webClient.DownloadFile(url, @"c:/etc../"); 

,但不起作用。 在調試模式下,如果我在WebClient.DownloadFile上放置BREAK POINT,並且在3,4秒後再次啓動,服務器有時間創建文件,並且我有完整的下載。

Web服務的開發人員建議我在URL上使用「輪詢」,直到文件準備好下載爲止。它是如何工作的?

我該如何解決我的問題? (我也試過DownloadFile異步模式)

+0

問題是爲什麼服務返回到文件的url在文件準備好之前? 是否沒有另一個電話來查看您的工作是否已完成? – 2012-08-08 09:13:22

+0

當我調用Web服務的函數ExportPrice()時,我只收到一個url來下載包含xml價格表的zip文件,並且我嘗試使用url和webClient.DownloadFile() – Peppinosh 2012-08-08 09:49:41

回答

3

我在我的應用程序中有類似的機制,它完美的作品。 WebClient確實請求並等待,因爲服務器正在創建響應(文件)。如果WebClient下載0kb,這意味着服務器以一些空響應響應請求。這可能不是一個錯誤,而是一個設計。如果創建文件需要很長時間,則此方法可能會導致超時。另一方面,如果創建文件需要很短的時間,服務器端應該用文件響應(使WebClient掛起請求,直到文件準備就緒)。我會試着與其他開發者討論這個問題,也許重新設計「文件生成器」。

編輯:合併意味着在循環中發出請求,例如每2秒。我正在使用DownloadData,因爲它無用,而且耗費資源,每次都會保存空文件,這是DownloadFile的功能。

 public void PoolAndDownloadFile(Uri uri, string filePath) 
     { 
      WebClient webClient = new WebClient(); 
      byte[] downloadedBytes = webClient.DownloadData(uri); 
      while (downloadedBytes.Length == 0) 
      { 
       Thread.Sleep(2000); 
       downloadedBytes = webClient.DownloadData(uri); 
      } 
      Stream file = File.Open(filePath, FileMode.Create); 
      file.Write(downloadedBytes, 0, downloadedBytes.Length); 
      file.Close(); 
     } 
+0

我不是唯一一個消耗這個網絡服務(一家主要的郵輪公司),顯然其他人使用它沒有問題。正如我已經說過的,建議我使用共享系統,我不知道如何在網址上使用它。 – Peppinosh 2012-08-08 09:42:16

+0

我不知道如何對網址進行「共享」。 * – Peppinosh 2012-08-08 10:18:35

+1

這完美的作品!大約需要15秒,但這是一個服務器問題。謝謝!我是意大利人,我會給你一個披薩! ;) – Peppinosh 2012-08-08 13:08:21