繁体   English   中英

C#HttpListener Response + GZipStream

[英]C# HttpListener Response + GZipStream

我将HttpListener用于我自己的http服务器(我不使用IIS)。 我想通过GZip压缩来压缩我的OutputStream:

byte[] refBuffer = Encoding.UTF8.GetBytes(...some data source...);

var varByteStream = new MemoryStream(refBuffer);

System.IO.Compression.GZipStream refGZipStream = new GZipStream(varByteStream, CompressionMode.Compress, false);

refGZipStream.BaseStream.CopyTo(refHttpListenerContext.Response.OutputStream);

refHttpListenerContext.Response.AddHeader("Content-Encoding", "gzip");

但我在Chrome中遇到错误:

ERR_CONTENT_DECODING_FAILED

如果我删除AddHeader,它可以工作,但响应的大小似乎没有被压缩。 我究竟做错了什么?

问题是您的转移方向错误。 你想要做的是将GZipStream附加到Response.OutputStream然后在MemoryStream上调用CopyTo,传入GZipStream,如下所示:

refHttpListenerContext.Response.AddHeader("Content-Encoding", "gzip"); 

byte[] refBuffer = Encoding.UTF8.GetBytes(...some data source...); 

var varByteStream = new MemoryStream(refBuffer); 

System.IO.Compression.GZipStream refGZipStream = new GZipStream(refHttpListenerContext.Response.OutputStream, CompressionMode.Compress, false); 

varByteStream.CopyTo(refGZipStream); 
refGZipStream.Flush();

第一个问题(如Brent M Spell所述)是标题的错误位置。 第二个是你没有正确使用GZipStream。 此流需要一个“顶部”流来写入,这意味着一个空流(用缓冲区填充它)。 有一个空的“顶部”流,那么你所要做的就是在GZipStream上写下你的缓冲区。 结果,存储器流将由压缩内容填充。 所以你需要这样的东西:

byte[] buffer = ....;

using (var ms = new MemoryStream())
{
    using (var zip = new GZipStream(ms, CompressionMode.Compress, true))
    zip.Write(buffer, 0, buffer.Length);
    buffer = ms.ToArray();
}

response.AddHeader("Content-Encoding", "gzip");
response.ContentLength64 = buffer.Length;

response.OutputStream.Write(buffer, 0, buffer.Length);

希望这可能有所帮助,他们讨论如何让GZIP工作。

C#中的套接字:如何获取响应流?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM