2009-12-22 18 views
4

Nous avons un code assez commun qui a bien fonctionné:filtres Flushing et la compression (ASP.NET MVC)

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)); 
     } 
    } 
} 

Maintenant, je suis en train d'utiliser Response.Flush() pour livrer une partie de la page, pour améliorer l'expérience utilisateur. Avec ce scénario, lorsque response.Filter est modifié par chaque opération d'écriture, il est clair que la page doit être remise à la fois. Comment puis-je rendre mon application pour écrire dans un flux intermédiaire, puis le compresser, puis appuyer sur Response.Filter?

+0

trendy, a fait le blog phpied poste vous inspire? :) –

+0

Non, juste "besoin de vitesse" ... Je veux dire la vitesse de réponse de l'application – st78

Répondre

1

Jusqu'à présent, cela ne semble pas être résoluble, car asp.net utilisation même flux pour l'entrée et la sortie des filtres

-2

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

1- Utiliser la compression IIS, pas besoin de réinventer la roue 2 Utiliser la mise en cache de sortie pour les actions que son contenu ne changera pas fréquemment. 3- Utilisez le Rendu Partiel, vous allez d'abord afficher les parties les plus importantes de votre page, puis émettre des requêtes Ajax pour charger le reste du contenu de la page, de cette façon vous pouvez livrer la page en plusieurs morceaux