¿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.Body
noResponse.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;
}
}