我正在尝试解压缩从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
中?(我真的不想这样做,因为一旦我解压缩了包流,我就对它不感兴趣。
呵呵,没关系。streaming
参数仅用于动态编写System.IO.Packaging.Package
。从第 954 行开始,有一堆"写入时 streaimg API"方法。还有一个ThrowIfInStreamingCreation()
方法,它仅在我尝试编写包时引发异常。
所以是的,我必须将来自HttpWebResponse
的不可搜索流缓存在MemoryStream
或临时文件中。没有即时为我拆包:(