从不可搜索的流中打开 System.IO.Packaging.Package

Opening a System.IO.Packaging.Package from a non-seekable Stream

我正在尝试解压缩 System.IO.Packaging.Package that I received from a web server. That is, I am using the System.IO.Packaging.Package.Open(Stream) 方法并将其传递给 System.Net.HttpWebResponse 的响应流。不幸的是,这引发了一个 System.ArgumentException 告诉我它

Cannot operate on [a] stream that does not support seeking.

查看参考资料,发现 System.IO.Packaging.Package 使用 System.IO.Packaging.ZipPackage 作为其唯一实现,而后者又使用内部 ZipArchive class。果然,如果 stream.CanSeekfalseValidateModeAccessStreamStreamingCombinations() 方法会在第 588 行引发此异常,我的 HttpWebResponse.

的响应流就是这种情况

然而,有一个神奇的 streaming 参数,它显然总是 false 并且从 Package.Open() 方法一直传递到 ValidateModeAccessStreamStreamingCombinations() .

所以这是我的问题:有什么方法可以使用 Package.Open(Stream) 从不可搜索的流中动态构建 Package 吗?或者我是否必须将流内容缓存在某个地方,例如在 MemoryStream 中? (我真的不想那样做,因为我对解压后的包流不感兴趣。)

呵呵,没关系。 streaming 参数仅用于即时 写入 一个 System.IO.Packaging.Package。从 line 954 there are a bunch of "Write-time streaimg API" methods. There also is a ThrowIfInStreamingCreation() 方法开始,它只在我尝试编写包时引发异常。

所以,是的,我必须将来自 HttpWebResponse 的不可搜索流缓存在 MemoryStream 或临时文件中。没有为我即时拆包:(