4 votes

Filtres de vidange et de compression (ASP.NET MVC)

Nous avons un code assez commun qui fonctionne bien :

public class CompressionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        if (request.IsAjaxRequest())
            return;

        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding)) return;
        acceptEncoding = acceptEncoding.ToUpperInvariant();
        HttpResponseBase response = filterContext.HttpContext.Response;

        if (acceptEncoding.Contains("GZIP"))
        {
             response.AppendHeader("Content-encoding", "gzip");
             response.Filter = new WhitespaceFilter(new GZipStream(response.Filter, CompressionMode.Compress));
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
             response.AppendHeader("Content-encoding", "deflate");
             response.Filter =  new WhitespaceFilter(new DeflateStream(response.Filter, CompressionMode.Compress));
        }
    }
}

J'essaie maintenant d'utiliser Response.Flush() pour fournir une partie de la page, pour améliorer l'expérience de l'utilisateur. Avec ce scénario, lorsque response.Filter est modifié par chaque opération d'écriture, il est clair que la page doit être livrée en une seule fois. Comment puis-je faire en sorte que mon application écrive dans un flux intermédiaire, puis le compresse, et enfin le pousse vers le serveur de l'entreprise ? Response.Filter ?

1voto

Sergey Osypchuk Points 2225

Jusqu'à présent, cela semble impossible à résoudre, car asp.net utilise le même flux pour l'entrée et la sortie des filtres.

-2voto

Haitham Shaddad Points 3134

Je ne pense pas que ce soit faisable, mais si vous avez besoin d'améliorer les performances et l'expérience utilisateur, vous pouvez faire ce qui suit :

1- Utilisez la compression IIS, pas besoin de réinventer la roue. 2- Utilisez le cache de sortie pour les actions dont le contenu ne changera pas fréquemment. 3- Utilisez la fonction de rendu partiel (Partial Rendering) : vous commencerez par afficher les parties les plus importantes de votre page, puis vous enverrez des requêtes Ajax pour charger le reste du contenu de la page, ce qui vous permettra de livrer la page en plusieurs morceaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X