等待下载完成

时间:2012-08-08 09:10:09

标签: c# web-services soap download polling

我需要从网络服务下载实时创建的zip文件。 让我解释。 我正在开发一个使用SoapXml Web服务的Web应用程序。 Web服务中有Export函数,它返回一个临时URL来下载文件。根据请求下载,服务器会创建该文件,并在几秒钟后可供下载。 我正在尝试使用

  

webClient.DownloadFile(url,@“c:/ etc ../")

此功能下载文件并将其保存到我0kb。太快了!服务器没有时间创建文件。我也试着把

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

但不起作用。 在调试模式下,如果我在webClient.DownloadFile上放置BREAK POINT并在3,4秒后重新启动,则服务器有时间创建文件并且我有完整下载。

webservice的开发人员建议我在url上使用“polling”,直到文件准备好下载。它是如何工作的?

我该怎样解决我的问题? (我也尝试过DownloadFile异步模式)

1 个答案:

答案 0 :(得分: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();
        }
相关问题