使用c#webservice下载大文件

时间:2010-06-08 14:01:05

标签: c# web-services

我正在尝试创建一个允许其消费者下载文件的web服务(可能是非常大的文件)。在服务器上,我有许多文件需要发送回消费者,所以我将所有这些文件压缩成一个大的zip文件并将它们传回给用户。现在,我的web服务将开始压缩文件,当请求进入时,形成zip文件并将其流回。有时压缩可能需要很长时间,并且请求可能会超时。我该怎么做才能避免这种情况?我现在的解决方案是将数据分成较小的zip文件,向消费者发送响应,说会有这么多小文件,让消费者发送个别小文件的请求。所以,如果我有1GB的zip文件,我会把它分成10个较小的zip文件,并要求消费者在10个请求中请求较小的文件。这是正确的方法吗?我可以遇到什么问题?以前有没有人有这样的问题吗?如果你能分享你的经验,我会很高兴。此外,是否可以开始流式传输zip文件而不完全形成它们?

3 个答案:

答案 0 :(得分:2)

将请求和传递视为异步操作。

客户端可以使用一种方法请求文件。另一种方法可以让客户端知道文件打包的状态(它们是否已准备好下载)。第三种方法实际上可以下载文件。

答案 1 :(得分:0)

值得看看一个宁静的方法。而不是肥皂网服务。作为OrbMan,建议采用异步方法可能是最好的。

使用REST,您可以将资源公开为:http://yourlocation/generatefile 其中(当使用帖子调用时)会返回一个http响应,响应代码为301'已接受',位置标头值为location = http://yourlocation/generatefile/id00124,表示数据的位置。

然后,您可以轮询http://yourlocation/generatefile/id00124资源(可能只是标头请求)以获取状态,即处理/完成。

处理完成后。请到http://yourlocation/generatefile/id00124下载您的文件。响应http消息应标识您的文件和格式,即加密和压缩类型,以便任何消费者知道如何阅读它。

对于长时间运行的问题,这是一个很好的解决方案,并以soap anbd general xml以外的格式返回数据。

我希望这会有所帮助

答案 2 :(得分:0)

我会从调用客户端轮询作为获取文件的方法的一部分。客户端代码可能会像这样:

byte[] GetFile()
{
   response = request.Post(http://yourlocation/generatefile);
   string dataResource = response.Headers["Location"];
   bool resourceReady = false;
   while(!reasourceReady)
   {
     resH = request.Header(dataResource);
     if(resH.Headers[Status] == "complete")
         break;
     else
         Thread.Sleep(OneSecond); ?? or whetever
   }

   fileRes = request.Get(dataResource);

return fileRes.ToByteArray();
}

这只是假的,但我希望它有意义......