Ich habe gekämpft, um die Response.Body
-Eigenschaft von einer ASP.NET Core-Aktion zu bekommen und die einzige Lösung, die ich identifizieren konnte, scheint eher hacky. Die Lösung erfordert das Austauschen von Response.Body
mit einer MemoryStream
beim Lesen des Streams in eine Zeichenfolge und dann das Austauschen vor dem Senden an den Client. In den folgenden Beispielen versuche ich den Wert Response.Body
in einer benutzerdefinierten Middleware-Klasse zu erhalten. Response.Body
ist eine einzige Eigenschaft in ASP.NET Core aus irgendeinem Grund gesetzt? Fehle ich hier etwas oder ist das ein Versager/Bug/Design-Problem? Gibt es eine bessere Möglichkeit, Response.Body
zu lesen?Wie liest man ASP.NET Core Response.Body?
Hacky Lösung:
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;
}
}
}
Versuchte Lösung mit EnableRewind(): funktioniert nur für Request.Body
, nicht Response.Body
. Dies führt dazu, dass ein leerer String von Response.Body
gelesen wird und nicht der eigentliche Inhalt des Antworttexts (den ich mit PostMan verifiziert habe).
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;
}
}
, die durch Design ist. – Nkosi