我有一个WCF服务,它返回一个带有Zip文件(50MB)的字节数组给任何请求它的客户端。如果Zip非常小(比如1MB),则SOAP响应来自WCF,其中嵌入了字节数组。但即使对于1MB的文件,响应大小也非常大。如果我尝试传输50MB文件,服务会挂起并引发内存不足异常,因为SOAP响应变得非常大。
当我发回一个字节数组时,WCF / Web服务可用于传输大文件(主要是ZIP格式)的最佳选项是什么。是否有任何好方法而不是发回文件?
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;
一份工作/真实的信息将非常有用,因为我正在努力应对谷歌提供的所有数据,并且上周没有取得好成绩。
答案 0 :(得分:4)
您可以传输Stream through WCF,然后您可以发送(几乎)无限长度的文件。
答案 1 :(得分:2)
我遇到了完全相同的问题。内存不足是不可避免的,因为你使用的是Byte数组。
我们所做的是刷新硬盘上的数据,因此您不必受虚拟内存的限制,并发交易的容量就是高清空间。
然后,为了转移,我们将文件放在另一台计算机上。当然,在我们的例子中,它是服务器到服务器文件传输。如果您希望从对等体中解除分离,可以使用http。
中的文件下载因此,您的服务可以使用http url响应文件位置,而不是使用文件进行响应。然后,当客户端使用标准HttpRequest或WebClient成功下载服务器时,它会调用删除文件的方法。在SOAP中可以是Delete(string url),在REST中,它将是资源上的delete方法。
我希望这对你有意义。最重要的部分是了解在可扩展的软件中,特别是如果您正在查看10000个客户端(并发?),您可能不会使用有限的资源,如内存流或字节数组。而是依赖大型且易于扩展的资源,例如硬盘驱动器分区,最终可以在SAN上运行,IT可以根据需要增加分区。