1

我需要从网络服务下载一个实时创建的 zip 文件。让我解释。我正在开发一个使用 SoapXml Web 服务的 Web 应用程序。Web 服务中有一个导出函数,它返回一个临时 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 秒后重新启动,服务器就有时间创建文件并且我有完整的下载。

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

我该怎么做才能解决我的问题?(我也试过 DownloadFile 异步模式)

4

1 回答 1

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();
        }
于 2012-08-08T09:28:57.077 回答