2012-08-08 114 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