如何在WCF流模式下获取流上的Seek方法?

如何在WCF流模式下获取流上的Seek方法?,wcf,stream,dotnetzip,Wcf,Stream,Dotnetzip,假设我有一个WCF方法 [OperationContract] bool UploadFile(Stream stream); 如何在流上获取Seek功能 我需要它满足两个要求: 读取流的前四个字节以确定文件类型是否具有50 4B 03 04ZIP文件签名,并倒带(stream.Seek(0,SeekOrigin.Begin)) 从流中读取DotNetZipIonic.Zip.ZipFile:ZipFile Zip=ZipFile.Read(流)(需要可查找流) 我发现你不能在WCF中寻找流

假设我有一个WCF方法

[OperationContract]
bool UploadFile(Stream stream);
如何在
上获取Seek功能

我需要它满足两个要求:

  • 读取流的前四个字节以确定文件类型是否具有
    50 4B 03 04
    ZIP文件签名,并倒带(
    stream.Seek(0,SeekOrigin.Begin)
  • 从流中读取DotNetZip
    Ionic.Zip.ZipFile
    ZipFile Zip=ZipFile.Read(流)
    (需要可查找流)
  • 我发现你不能在WCF中寻找流


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

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

  • 要查看流的头,我先读取流的前四个字节,然后使用类似的方法将前四个字节连接起来,您可以将其放入
    MemoryStream
    和原始WCF流的其余部分。这将基本上缓冲流的一部分,但是连接的流仍然呈现位于位置0的流,而不需要搜索

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

  • 行代码解释

  • 创建新的memorysteam供zip库使用
  • 通过TestStream“request”将http请求复制到memorystream
  • 现在,由于复制,流位置位于流的末尾,所以将其搜索回起始位置
  • 实际上在memorystream上调用zip,完成

  • 由于ionic zip不支持直接在流上工作,因此需要执行此额外步骤

    描述此代码的一点文字将大大改进此答案。
    MemoryStream ms = new MemoryStream();
    request.FileByteStream.CopyTo(ms);
    s.Position = 0;
    var zip = Ionic.Zip.ZipFile.Read(ms)