【发布时间】:2016-05-16 06:16:03
【问题描述】:
有没有办法将不确定Stream的长度传递给WCF服务?
Unsertain Stream指的是流
- 流仅在处理和写入数据后提供其长度。
例如GZipStream
背景
我正在创建一个 WCF 服务从客户端接收 多个 流。
由于 WCF Streaming 只允许消息中包含一个流,因此我决定将所有流连接成一个流并在服务器代码中划分它。
客户端提供的流将包含可变类型的流,例如FileStream、MemoryStream,以及来自 DataTable 序列化的数据和
using (var fileStream = new FileStream(filePath, FileMode.Open))
using (var memoryStream = new MemoryStream())
using (var concatStream = new ConcatenatedStream(fileStream, memoryStream))
{
client.UploadStreams(concatStream);
}
ConcatenatedStream 是 c# - How do I concatenate two System.Io.Stream instances into one? - Stack Overflow 中建议的 Stream 实现。
在服务器端,将单个流划分为多个流需要每个流的长度。
由于我想在客户端节省内存,我决定使用 PullStream。
PullStream 将根据Read 的要求将Write 缓冲。
但这会导致一个大问题。在开始流式传输之前我无法获得 PullStream 的长度。
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
也许你可以将所有这些流压缩成一个并在服务器上解压缩它们?
-
因为我用的是.NET 3.0,
ZipArchiver不能用。将文件压缩到本地文件夹需要额外消耗 CPU 和内存,不是吗?但是当没有其他方法时,压缩仍然是我最后的选择。