Edw*_*d83 5 c# encoding gzip httplistener 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");
Run Code Online (Sandbox Code Playgroud)
但我在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();
Run Code Online (Sandbox Code Playgroud)
小智 5
第一个问题(正如 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5807 次 |
| 最近记录: |