Почему исходное тело возвращается в промежуточное программное обеспечение сжатия Asp.Net Core? - PullRequest
2 голосов
/ 27 июня 2019

Во многих фрагментах кода, которые включают изменение тела запроса или ответа в Asp.Net, поток тела просто заменяется новым и вызывается следующий шаг.Например, здесь: https://stackoverflow.com/a/44500627 А здесь: Запрос декомпрессии содержимого в ASP.Net Core

Однако в исходном коде самого Asp.Net Core после обработки запроса старый оригиналТело ответа возвращается обратно в объект ответа.См. Здесь: https://github.com/aspnet/BasicMiddleware/blob/master/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionMiddleware.cs

Есть ли какая-либо причина для помещения исходного потока обратно в объект ответа во втором случае?

Я покажу ключевое отличие:

Без возврата исходного потока

public Task Invoke(HttpContext context)
{
    if(NeedCompress(context))
    { 
        Stream oldBody = context.Response.Body;
        context.Response.Body = new GZipStream(oldBody, CompressionMode.Fastest, leaveOpen:true);
    }
    return next(context);
}

С возвращением старого тела:

public Task Invoke(HttpContext context)
{
    if(NeedCompress(context))
    { 
        Stream oldBody = context.Response.Body;
        Stream newBody = new GZipStream(oldBody, CompressionMode.Fastest, leaveOpen:true);
        context.Response.Body = newBody;
        await next(context);
        newBody.Dispose()
        context.Response.Body = oldBody; // Why?
    }
    else
        await next(context);
}

В моем коде я использовал первый подход, и он хотел работать.Однако я не уверен, что это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...