1

HTTP 応答に gzip または deflate 圧縮を適用すると、JSON 構造の最後のブラケットが失われているようです。例えば:

圧縮なしの結果:

{"alist":{"P_1":0,"P_2":0,"P_3":0}}

ブラウザが受信した圧縮結果:

{"alist":{"P_1":0,"P_2":0,"P_3":0}

圧縮せずに応答を書くとき、私は次のことをしています:

byte[] buffer = Encoding.UTF8.GetBytes(responseContent);

context.Response.ContentLength64 = buffer.Length;
context.Response.ContentType = ContentTypeJson;

Stream outputStream = context.Response.OutputStream;
outputStream.Write(buffer, 0, buffer.Length);
outputStream.Close();

あるいは、呼び出し元が Accept-Encoding 要求ヘッダーを提供する場合、次のように圧縮して応答を書き込もうとします。

byte[] buffer = Encoding.UTF8.GetBytes(responseContent);
byte[] compressedBuffer;

using (var memoryStream = new MemoryStream())
{
    using (Stream compressionStream = new DeflateStream(memoryStream, CompressionMode.Compress, false))
    {
        compressionStream.Write(buffer, 0, buffer.Length);

        compressedBuffer = memoryStream.ToArray();

        compressionStream.Close();
    }

    memoryStream.Close();
}

context.Response.ContentLength64 = compressedBuffer.Length;
context.Response.ContentType = ContentTypeJson;

Stream outputStream = context.Response.OutputStream;
outputStream.Write(compressedBuffer, 0, compressedBuffer.Length);
outputStream.Close();

それが役立つ場合、私は System.Net.HttpListener を使用しているため、自分でこれを行う必要があります。この切り捨てが発生している理由を誰か知っていますか?

4

1 に答える 1

0

DeflateStreamは、書き込んだ直後にすべてを出力ストリームに書き込むわけではありませんが、閉じた後は書き込んだことを確認できます。したがって、次のように動作します。

compressionStream.Write(buffer, 0, buffer.Length);

compressionStream.Close();

compressedBuffer = memoryStream.ToArray();
于 2011-07-04T08:17:23.923 に答える