我需要从网络服务下载实时创建的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异步模式)
答案 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();
}