ASP.NET核心压缩中间件 - 空响应

时间:2016-07-08 14:11:28

标签: asp.net-core asp.net-core-mvc asp.net-core-1.0

我正在使用一些自定义压缩中间件from this repository(粘贴在下面)。在第一次请求时,内容被压缩得很好。对于之后的每个请求,响应都返回完全为空(Content-Length为0)。

这只是在从ASP.NET Core RC2迁移到RTM后才开始发生的。

有谁知道为什么会这样?

CompressionMiddleware:

public class CompressionMiddleware
{
    private readonly RequestDelegate _next;

    public CompressionMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (IsGZipSupported(context))
        {
            string acceptEncoding = context.Request.Headers["Accept-Encoding"];

            var buffer = new MemoryStream();
            var stream = context.Response.Body;
            context.Response.Body = buffer;
            await _next(context);

            if (acceptEncoding.Contains("gzip"))
            {
                var gstream = new GZipStream(stream, CompressionLevel.Optimal);
                context.Response.Headers.Add("Content-Encoding", new[] { "gzip" });
                buffer.Seek(0, SeekOrigin.Begin);
                await buffer.CopyToAsync(gstream);
                gstream.Dispose();
            }
            else
            {
                var gstream = new DeflateStream(stream, CompressionLevel.Optimal);
                context.Response.Headers.Add("Content-Encoding", new[] { "deflate" });
                buffer.Seek(0, SeekOrigin.Begin);
                await buffer.CopyToAsync(gstream);
                gstream.Dispose();
            }
        }
        else
        {
            await _next(context);
        }
    }

    public bool IsGZipSupported(HttpContext context)
    {
        string acceptEncoding = context.Request.Headers["Accept-Encoding"];
        return !string.IsNullOrEmpty(acceptEncoding) &&
               (acceptEncoding.Contains("gzip") || acceptEncoding.Contains("deflate"));
    }
}

1 个答案:

答案 0 :(得分:2)

我在“Add HTTP compression middleware”问题中找到了以下内容:

我添加了gzip并且它有效,但首先请求。我的意思是在第一个请求中,响应页面为null(context.Response.Body)但是当你刷新页面(只有一次)之后它就能正常工作。(我不知道为什么,但我必须解决它)< / em>的

对问题的回答是:

  

您需要更新   context.Response.Headers [“Content-Length”]与实际压缩   缓冲长度。

     

CompressionMiddleware.cs

以上链接到压缩中间件的实现包含:

if (context.Response.Headers["Content-Length"].Count > 0)
{
   context.Response.Headers["Content-Length"] = compressed.Length.ToString();
}