开发者

JSON truncated when compressing HTTP responses

When I apply gzip or deflate compression to my HTTP responses, I seem to be losing the last bracket in my JSON structures. For example:

Result without compression:

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

Result with compression as received by the browser:

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

When writing the response 开发者_如何学编程without compression I am doing the following:

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();

Alternatively, when the caller provides an Accept-Encoding request header, I try and write the response with compression as follows;

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();

If it helps, I am using an System.Net.HttpListener which is why I have to do this myself. Does anyone have any idea why this truncation may be occuring?


DeflateStream doesn't write to its output stream everything immediately after you write into it, but you can be sure it has done so after you close it. So the following will work:

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

compressionStream.Close();

compressedBuffer = memoryStream.ToArray();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜