Dans ASP.NET Core, accéder plusieurs fois au flux de réponse peut être difficile. Cet article explore les limites du comportement Response.Body par défaut et propose une solution pour lire le flux de réponse dans un middleware personnalisé.
Dans ASP.NET Core, Response.Body est une propriété en écriture seule, ce qui signifie qu'elle n'est pas destinée à être lue dans le même cycle de requête. Cela fait partie de l'optimisation des performances du framework, mais peut entraîner des difficultés si vous devez accéder plusieurs fois au flux de réponse.
La solution mentionnée dans l'article semble sous-optimale car elle implique de remplacer le flux Response.Body par un MemoryStream pour la lecture. Il s’agit effectivement d’une approche efficace, quoique un peu indirecte.
À partir d'ASP.NET Core 2.1, il existe un meilleur moyen d'accéder plusieurs fois au flux de réponse : activer la mise en mémoire tampon. La nouvelle méthode Request.EnableBuffering() peut être utilisée pour mettre à niveau le flux de réponse vers un FileBufferingReadStream, qui prend en charge la recherche et les lectures multiples.
L'intégration de la mise en mémoire tampon des requêtes dans le middleware est relativement simple. Le code suivant montre comment procéder :
<code class="language-csharp">public class ResponseRewindMiddleware { private readonly RequestDelegate next; public ResponseRewindMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { Stream originalBody = context.Response.Body; try { using (var memStream = new MemoryStream()) { context.Response.Body = memStream; await next(context); memStream.Position = 0; string responseBody = new StreamReader(memStream).ReadToEnd(); memStream.Position = 0; await memStream.CopyToAsync(originalBody); } } finally { context.Response.Body = originalBody; } } }</code>
Le remplacement du flux Response.Body peut être un moyen viable de lire le flux de réponse plusieurs fois dans le middleware. Cependant, la méthode préférée consiste à utiliser Request.EnableBuffering() pour activer la mise en mémoire tampon sur le flux de réponse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!