2016-07-08 3 views
0

Я использую какое-то пользовательское промежуточное ПО для сжатия from this repository (вставлено ниже). По первому запросу содержимое сжимается просто отлично. Для каждого запроса после этого ответ возвращается как полностью пустой (с Content-Length of 0).Средство промежуточного сжатия ядра ASP.NET - пустой ответ

Это только начало происходить после перехода с 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

на самом деле не уверен, что это связано с проблемой, но почему вы не закроете буфера потока в конце концов? – Set

+0

@Set: Брошено следующее: Приложение не обработало необработанное исключение. System.ArgumentException: базовый поток не записывается. – davenewza

ответ

2

Я нашел следующее в "Add HTTP compression middleware" вопрос:

Я добавил GZIP, и она работала, но первый запрос. Я имею в виду в первом запросе, страница ответа - null (context.Response.Body), но когда вы обновляете страницу (только один раз), она работает правильно после этого (я не знаю, почему, но я должен ее решить)

И ответ на вопрос:

Вам необходимо обновить context.Response.Headers [ "Content-Length"] с фактической длиной сжатого буфера.

CompressionMiddleware.cs

и выше ссылку на реализацию сжатия промежуточного слоя содержит:

if (context.Response.Headers["Content-Length"].Count > 0) 
{ 
    context.Response.Headers["Content-Length"] = compressed.Length.ToString(); 
} 
Смежные вопросы