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