C#HttpListener响应+;GZipStream

C#HttpListener响应+;GZipStream,c#,encoding,gzip,httplistener,gzipstream,C#,Encoding,Gzip,Httplistener,Gzipstream,我为自己的http服务器使用HttpListener(我不使用IIS)。我想通过GZip压缩压缩我的OutputStream: byte[] refBuffer = Encoding.UTF8.GetBytes(...some data source...); var varByteStream = new MemoryStream(refBuffer); System.IO.Compression.GZipStream refGZipStream = new GZipStream(varB

我为自己的http服务器使用HttpListener(我不使用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中遇到了一个错误:

错误\u内容\u解码\u失败


如果我删除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();

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

第一个问题(如布伦特·M·斯佩尔所述)是头球位置错误。第二个问题是没有正确使用GZipStream。这个流需要一个“top”流来写入,这意味着一个空流(用缓冲区填充它)。如果有一个空的“top”流,那么您所要做的就是在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);

考虑到您实际上是以压缩的形式显式地编写内容,不可能因为标题而不压缩某些内容。你确定Chrome不只是给你文件的解压大小吗?@minitech,好问题!!!我正在检查实际的流量大小。