3

我有一个 WCF 服务,它向任何请求它的客户端返回一个带有 Zip 文件 (50MB) 的字节数组。如果 Zip 非常小(例如 1MB),则 SOAP 响应来自 WCF,其中嵌入了字节数组。但是即使对于 1MB 的文件,响应大小也非常大。如果我尝试传输 50MB 文件,服务会挂起并引发内存不足异常,因为 SOAP 响应的大小会变得很大。

  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

2 回答 2

4

您可以通过 WCF 传输流,然后可以发送(几乎)无限长度的文件。

于 2010-07-21T13:07:18.897 回答
2

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

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

然后为了传输,我们将文件放在另一台计算机上。当然,在我们的例子中,它是服务器到服务器的文件传输。如果要与对等体解耦,可以使用 http 中的文件下载。

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

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

于 2010-07-21T13:32:17.733 回答