2010-07-21 40 views
3

我有一个WCF服务,返回一个带有Zip文件(50MB)的字节数组给任何请求它的客户端。如果Zip非常小(比如说1MB),则SOAP响应来自WCF,其中嵌入了字节数组。但即使对于1MB文件,响应大小也非常巨大。如果我尝试传输50MB文件,则服务挂起并抛出内存不足异常,因为SOAP响应的大小变得很大。如何使用WCF服务通过SOAP将大型Zip文件(50MB)传输到任何客户端?

  1. 什么是WCF/web服务可用于传输大文件(主要是ZIP格式)的最佳选择,因为我正在发送一个字节数组。有没有什么好的办法,而不是发回文件?

  2. WCF/web服务是否是将大文件传输到任何客户端的最佳方式,还是有其他更好的选项/技术可用,从而实现10,000个用户的互操作性和可伸缩性?

我CCODE低于:

 String pathfordownload = @"D:\New Folder.zip"; 
     FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read); 
     BinaryReader binReader = new BinaryReader(F2D); 
     binReader.BaseStream.Position = 0; 
     byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length)); 
     binReader.Close(); 
     return binFile; 

一个工作片/真实的信息块会像我跟所有在谷歌提供的数据挣扎,有过去年不会有好结果真的很有帮助周。

回答

4

您可以转让Stream through WCF,然后您可以发送(几乎)无限长度的文件。

2

我遇到了完全相同的问题。内存不足是不可避免的,因为您使用的是字节数组。

我们所做的就是刷新硬盘上的数据,因此您的虚拟内存不会限制您的并发事务容量,即HD空间。

然后,为了传输,我们将jut文件放在另一台计算机上。当然在我们的情况下,它是服务器文件传输的服务器。如果你想解除对等体的解耦,你可以使用http下载一个文件。

因此,而不是与文件的响应,您的服务可以与一个http url到文件位置响应。然后,当客户端使用标准HttpRequest或WebClient成功下载服务器时,它会调用删除文件的方法。在SOAP中可以是Delete(字符串url),在REST中可以是资源上的删除方法。

我希望这对你有意义。其中最重要的部分是了解在可伸缩软件中,尤其是如果您正在查看10000个客户端(并发?)时,您可能不会使用有限的资源,如内存流或字节数组。而是依赖于大型且易于扩展的资源,例如最终将在SAN上运行的硬盘分区,并且IT可根据需要增加分区。

+0

我已经尝试使用RESTFul WCF服务及其工作正常。 – Defendore 2010-09-15 06:04:00

相关问题