我正在尝试为 Web API MessageHandler 编写一个解压缩机制。然而,尽管进行了一些研究,我似乎无法完成这项工作:-(
通过以下测试可以重现该问题:
[Test]
public void Deflate()
{
using (var outStream = new MemoryStream())
{
using (var compressionStream = new DeflateStream(outStream, CompressionMode.Compress, true))
{
using (var original = new MemoryStream(Encoding.UTF8.GetBytes("original content")))
{
original.CopyTo(compressionStream);
}
}
//this passes
Assert.IsTrue(outStream.Length > 0);
var compressedStream = outStream;
var decompressionResultStream = compressedStream.DeflateDecompressor();
//this fails
Assert.IsTrue(decompressionResultStream.Length > 0);
var output = Encoding.UTF8.GetString(decompressionResultStream.ToArray());
Assert.AreEqual("original content", output);
}
}
以及以下解压缩处理程序
public static class DecompressionHandlers
{
public static MemoryStream DeflateDecompressor(this Stream compressedStream)
{
var decompressionResultStream = new MemoryStream();
using (var decompressionStream = new DeflateStream(compressedStream, CompressionMode.Decompress, true))
{
decompressionStream.CopyTo(decompressionResultStream);
decompressionStream.Flush();
}
return decompressionResultStream;
}
public static MemoryStream GZipDecompressor(this Stream compressedStream)
{
var decompressionResultStream = new MemoryStream();
using (var decompressionStream = new GzipStream(compressedStream, CompressionMode.Decompress, true))
{
decompressionStream.CopyTo(decompressionResultStream);
decompressionStream.Flush();
}
return decompressionResultStream;
}
}
希望这是一个直接的 ID-10-T 问题,非常感谢您提供任何建议!
这将在 Web API MessageHandler 中使用,这很可能是转移注意力,但为了完整性而包含在内
最佳答案
在您的代码中,在调用解压缩之前尝试重置 compressedStream
的位置。
compressedStream.Position = 0;
var decompressionResultStream = compressedStream.DeflateDecompressor();
请注意,您似乎在 GZipDecompressor 方法中使用 DeflateStream 而不是 GZipStream。
关于c#-4.0 - 编写要在 Web API MessageHandler 中使用的解压缩机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21730391/