J'ai eu du mal à obtenir l' Response.Body
de la propriété d'un ASP.NET de Base d'action et la seule solution que j'ai été en mesure d'identifier semble sous-optimale. La solution nécessite d'échanger Response.Body
avec un MemoryStream
lors de la lecture du flux dans une variable de chaîne, puis échange de revenir avant de les envoyer au client. Dans les exemples ci-dessous, je vais essayer d'obtenir l' Response.Body
de la valeur personnalisé dans un middleware de classe. Response.Body
est un jeu seule propriété ASP.NET de Base pour une raison quelconque? Suis-je tout simplement manque quelque chose ici, ou est-ce un oubli/bug/problème de conception? Est-il une meilleure façon de lire Response.Body
?
Courant (sous-optimal) solution:
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;
}
}
}
Tentative de solution à l'aide de EnableRewind():
Cela fonctionne uniquement pour Request.Body
, pas Response.Body
. Cette résultats dans la lecture d'une chaîne vide à partir d' Response.Body
plutôt que sur le corps de la réponse de contenu.
De démarrage.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;
}
}