代码之家  ›  专栏  ›  技术社区  ›  Paul D'Ambra

编写要在Web API MessageHandler中使用的解压缩机制

  •  2
  • Paul D'Ambra  · 技术社区  · 12 年前

    我正在尝试为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-ten-T问题,我们非常感谢您的建议!

    这将被用于Web API MessageHandler可能是一个危险的话题,但为了完整起见,包含了这一点

    1 回复  |  直到 12 年前
        1
  •  3
  •   Kiran    12 年前

    在代码中,尝试重置 compressedStream 在对其调用解压缩之前。

    compressedStream.Position = 0;
    var decompressionResultStream = compressedStream.DeflateDecompressor();
    

    注意,您似乎在GZipDecompressor方法中使用DeflateStream而不是GZipStream。

    推荐文章