6

私は自分のhttpサーバーにHttpListenerを使用しています(IISは使用していません)。OutputStreamをGZip圧縮で圧縮したい:

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を削除すると機能しますが、応答のサイズが圧縮されていないようです。私は何が間違っているのですか?

4

3 に答える 3

10

問題は、転送が間違った方向に進んでいることです。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();
于 2011-09-16T01:57:23.887 に答える
4

最初の問題(Brent M Spellが述べたように)は、ヘッダーの位置が間違っていることです。2つ目は、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);
于 2012-06-06T23:59:47.217 に答える
0

これが役立つことを願って、彼らはGZIPを機能させる方法について話し合います。

C#のソケット:応答ストリームを取得する方法は?

于 2011-09-16T05:11:29.847 に答える