从不可搜索的流中打开 System.IO.Packaging.Package
Posted
技术标签:
【中文标题】从不可搜索的流中打开 System.IO.Packaging.Package【英文标题】:Opening a System.IO.Packaging.Package from a non-seekable Stream 【发布时间】:2015-04-30 11:07:27 【问题描述】:我正在尝试解压缩从 Web 服务器收到的 System.IO.Packaging.Package
。也就是说,我正在使用System.IO.Packaging.Package.Open(Stream)
方法并将System.Net.HttpWebResponse
的响应流传递给它。不幸的是,这引发了System.ArgumentException
告诉我它
无法对不支持搜索的 [a] 流进行操作。
查看参考源,发现System.IO.Packaging.Package
使用System.IO.Packaging.ZipPackage
作为其唯一实现,而后者又使用内部ZipArchive
类。果然,如果stream.CanSeek
是false
,ValidateModeAccessStreamStreamingCombinations()
方法会在第 588 行引发此异常,我的HttpWebResponse
的响应流就是这种情况。
但是,有一个神奇的 streaming
参数,显然它始终是 false
,并从 Package.Open()
方法一直传递到 ValidateModeAccessStreamStreamingCombinations()
。
所以这是我的问题:有什么方法可以使用Package.Open(Stream)
从不可搜索的流中即时构建Package
?还是我必须在某处缓存流内容,例如在MemoryStream
中? (我真的不想这样做,因为一旦我解压了包流,我就对它不感兴趣了。)
【问题讨论】:
【参考方案1】:嗯,没关系。 streaming
参数仅用于即时写入 System.IO.Packaging.Package
。从line 954 开始,有一堆“Write-time streimg API”方法。还有一个ThrowIfInStreamingCreation()
方法,它只会在我尝试编写包时引发异常。
是的,我必须将来自HttpWebResponse
的不可搜索流缓存在MemoryStream
或临时文件中。我没有即时拆包:(
【讨论】:
以上是关于从不可搜索的流中打开 System.IO.Packaging.Package的主要内容,如果未能解决你的问题,请参考以下文章