3

假设我有一个 WCF 方法

[OperationContract]
bool UploadFile(Stream stream);

如何获得 Seek 功能stream

我需要它来满足两个要求:

  1. 读取流的前四个字节以确定文件类型是否具有50 4B 03 04ZIP 文件签名,然后倒带 ( stream.Seek(0, SeekOrigin.Begin))
  2. Ionic.Zip.ZipFile从流中读取 DotNetZip :(ZipFile zip = ZipFile.Read(stream)需要流是可搜索的)
4

3 回答 3

2

我发现各种 来源声称您无法在 WCF 中寻找流。

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

于 2012-07-11T13:45:41.373 回答
2

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

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

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

于 2012-07-11T14:10:14.790 回答
0
MemoryStream ms = new MemoryStream();
request.FileByteStream.CopyTo(ms);
s.Position = 0;
var zip = Ionic.Zip.ZipFile.Read(ms)

逐行代码解释

  1. 为 zip 库创建新的 memorysteam 以使用
  2. 从http请求字节流“请求”复制到内存流
  3. 现在由于复制,流位置位于流的末尾,因此将其返回到开始位置
  4. 实际上在内存流上调用 zip,完成

这个额外的步骤是必要的,因为 ionic zip 不支持直接在流上工作

于 2015-08-30T12:29:34.983 回答