¿Cómo leer ASP.NET Core Response.Body?

He estado luchando por conseguir elResponse.Body propiedad de una acción de ASP.NET Core y la única solución que he podido identificar parece subóptima. La solución requiere un intercambioResponse.Body con unMemoryStream mientras lee la secuencia en una variable de cadena, luego la intercambia antes de enviarla al cliente. En los ejemplos a continuación, estoy tratando de obtener elResponse.Body valor en una clase de middleware personalizado.Response.Body es unconjunto ¿única propiedad en ASP.NET Core por alguna razón? ¿Me estoy perdiendo algo aquí o es un problema de supervisión / error / diseño? ¿Hay una mejor manera de leer?Response.Body?

Solución actual (subóptima):

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;
        }
    }
}  

Intento de solución usando EnableRewind (): Esto solo funciona paraRequest.BodynoResponse.Body. Esto resulta en la lectura de una cadena vacía deResponse.Body en lugar del contenido real del cuerpo de respuesta.

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;
    }
}