Во многих фрагментах кода, которые включают изменение тела запроса или ответа в 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);
}
В моем коде я использовал первый подход, и он хотел работать.Однако я не уверен, что это правильно.