2012-07-11 27 views
3

比方说,我有一个WCF方法如何在WCF流式传输模式下在Stream上获取Seek方法?

[OperationContract] 
bool UploadFile(Stream stream); 

我怎样才能在stream寻求功能?

我需要它的两个要求:

  1. 阅读前四个字节流,以确定是否该文件类型有50 4B 03 04 ZIP文件签名,复卷(stream.Seek(0, SeekOrigin.Begin)
  2. 从流中读取一个DotNetZip Ionic.Zip.ZipFileZipFile zip = ZipFile.Read(stream)(需要流是可查找)

回答

2

正如CodeCaster提到的,您无法寻找WCF流。你必须解决使用不同的方法您的问题:

  1. 要在流头偷看,我读到的前四个字节流的,然后使用类似ConcatenatedStream来连接前四字节,您可以将其放入MemoryStream和原始WCF流的其余部分。这将基本上缓冲部分流,但串联的流仍然呈现位于位置0的流而不需要查找。

  2. 如果DotNetZip需要寻找的能力,那么它需要能够访问文件的任何部分。您需要将整个WCF流读入一个MemoryStream并将其提供给DotNetZip。更有效的替代方法是编写自己的Stream包装类,它只会缓存已请求的最高位置的位置,这样如果DotNetZip只在文件的第一兆字节中查找,您只会缓存兆字节的数据(而不是整个50 GB的文件)。通过线

+0

感谢指针需要这个额外的步骤! – ipavlic 2012-07-12 07:09:40

2

我发现varioussources声称你不能寻求WCF流。

这应该是这样,因为最终你的数据将通过网络套接字发送,这在设计上不支持查找(它只是发送字节数组)。

0
MemoryStream ms = new MemoryStream(); 
request.FileByteStream.CopyTo(ms); 
s.Position = 0; 
var zip = Ionic.Zip.ZipFile.Read(ms) 

代码解释

  1. 对于ZIP库中创建新memorysteam从http请求的字节流 “请求”
  2. 拷贝工作由到的MemoryStream
  3. 现在是物流位置在流的末尾因为复制,所以找回它的起始位置
  4. 实际上调用压缩的记忆tream,做

因为离子拉链不支持流工作直接

+1

描述这段代码做些什么会大大改善这个答案。 – 2015-08-30 22:36:38