我正在使用一些自定义压缩中间件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"));
}
}
答案 0 :(得分:2)
我在“Add HTTP compression middleware”问题中找到了以下内容:
我添加了gzip并且它有效,但首先请求。我的意思是在第一个请求中,响应页面为null(context.Response.Body)但是当你刷新页面(只有一次)之后它就能正常工作。(我不知道为什么,但我必须解决它)< / em>的
对问题的回答是:
您需要更新 context.Response.Headers [“Content-Length”]与实际压缩 缓冲长度。
以上链接到压缩中间件的实现包含:
if (context.Response.Headers["Content-Length"].Count > 0)
{
context.Response.Headers["Content-Length"] = compressed.Length.ToString();
}