JSON усекается при сжатии HTTP-ответов - PullRequest
1 голос
/ 04 июля 2011

Когда я применяю сжатие gzip или deflate к своим HTTP-ответам, я, похоже, теряю последнюю скобку в моих структурах 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, поэтому я должен сделать это сам.У кого-нибудь есть идеи, почему это усечение может происходить?

1 Ответ

0 голосов
/ 04 июля 2011

DeflateStream не записывает в свой выходной поток все сразу после того, как вы в него записываете, но вы можете быть уверены, что это было сделано, так что после вы закрываете.Таким образом, будет работать следующее:

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

compressionStream.Close();

compressedBuffer = memoryStream.ToArray();
...