Como ler o ASP.NET Core Response.Body?

Eu tenho lutado para conseguir oResponse.Body propriedade de uma ação do ASP.NET Core e a única solução que consegui identificar parece subótima. A solução requer a trocaResponse.Body com umMemoryStream enquanto lê o fluxo em uma variável de cadeia e, em seguida, troca novamente antes de enviar para o cliente. Nos exemplos abaixo, estou tentando obter oResponse.Body valor em uma classe de middleware personalizada.Response.Body é umconjunto única propriedade no ASP.NET Core por algum motivo? Estou faltando alguma coisa aqui ou isso é um problema de supervisão / bug / design? Existe uma maneira melhor de lerResponse.Body?

Solução atual (subótima):

public class MyMiddleWare
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        using (var swapStream = new MemoryStream())
        {
            var originalResponseBody = context.Response.Body;

            context.Response.Body = swapStream;

            await _next(context);

            swapStream.Seek(0, SeekOrigin.Begin);
            string responseBody = new StreamReader(swapStream).ReadToEnd();
            swapStream.Seek(0, SeekOrigin.Begin);

            await swapStream .CopyToAsync(originalResponseBody);
            context.Response.Body = originalResponseBody;
        }
    }
}  

Tentativa de solução usando EnableRewind (): Isso só funciona paraRequest.Body, nãoResponse.Body. Isso resulta na leitura de uma string vazia deResponse.Body em vez do conteúdo real do corpo da resposta.

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifeTime)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.Use(async (context, next) => {
        context.Request.EnableRewind();
        await next();
    });

    app.UseMyMiddleWare();

    app.UseMvc();

    // Dispose of Autofac container on application stop
    appLifeTime.ApplicationStopped.Register(() => this.ApplicationContainer.Dispose());
}

MyMiddleWare.cs

public class MyMiddleWare
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        await _next(context);
        string responseBody = new StreamReader(context.Request.Body).ReadToEnd(); //responseBody is ""
        context.Request.Body.Position = 0;
    }
}  

questionAnswers(3)

yourAnswerToTheQuestion