Maison > développement back-end > C++ > Comment puis-je lire le Response.Body ASP.NET Core plusieurs fois dans un middleware ?

Comment puis-je lire le Response.Body ASP.NET Core plusieurs fois dans un middleware ?

Mary-Kate Olsen
Libérer: 2025-01-08 16:22:42
original
711 Les gens l'ont consulté

How Can I Read the ASP.NET Core Response.Body Multiple Times in Middleware?

Le middleware ASP.NET Core lit Response.Body plusieurs fois

Aperçu

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é.

Contexte

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.

Solution "Temporaire" : remplacer le 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.

Activer la mise en mémoire tampon pour Response.Body

À 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.

Solution middleware mise à jour

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>
Copier après la connexion

Conclusion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal