Lecture efficace du Response.Body d'ASP.NET Core : alternatives à l'échange de MemoryStream
Accéder à Response.Body
dans ASP.NET Core, un flux en lecture seule, présente un défi. Bien que l'échanger avec un MemoryStream
soit une solution de contournement courante, elle n'est pas optimale. Cet article explore des alternatives plus efficaces.
Le problème : La lecture directe Response.Body
est problématique en raison de sa nature en lecture seule, conçue pour l'optimisation des performances dans ASP.NET Core.
La solution inefficace (MemoryStream Swapping) : L'approche traditionnelle consiste à remplacer Response.Body
par un MemoryStream
, à lire le contenu, puis à restaurer le flux d'origine. Cela nécessite beaucoup de ressources et a potentiellement un impact sur les performances.
De meilleures approches :
Bien que l'échange MemoryStream fonctionne, ce n'est pas la méthode la plus efficace. Considérez ces alternatives :
Response.Body
vers un MemoryStream
, lit le contenu, puis restaure le flux d'origine. Cela maintient la logique de manipulation du flux isolée au sein du middleware. Voici un exemple simplifié :<code class="language-csharp">public class ResponseRewindMiddleware { private readonly RequestDelegate _next; public ResponseRewindMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var originalBody = context.Response.Body; using var memoryStream = new MemoryStream(); context.Response.Body = memoryStream; await _next(context); memoryStream.Seek(0, SeekOrigin.Begin); using var reader = new StreamReader(memoryStream); string responseBody = await reader.ReadToEndAsync(); memoryStream.Seek(0, SeekOrigin.Begin); await memoryStream.CopyToAsync(originalBody); context.Response.Body = originalBody; } }</code>
Response.Body
.Considérations importantes :
Response.Body
introduira une certaine surcharge de performances. Utilisez ces techniques judicieusement et uniquement lorsque cela est absolument nécessaire.try-catch
blocs) est cruciale pour empêcher les exceptions de perturber l'application.En utilisant un middleware ou une mise en cache des réponses (le cas échéant), vous pouvez améliorer considérablement l'efficacité de la lecture Response.Body
par rapport à la technique d'échange MemoryStream
directe. N'oubliez pas de peser soigneusement les implications en termes de performances avant de mettre en œuvre ces solutions.
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!