2009-11-19 7 views
1

J'ai implémenté la compression GZIP sur certaines de mes pages ASP.NET, en utilisant une classe qui hérite de System.Web.UI.Page, et en implémentant la méthode OnLoad pour faire la compression, comme ça :GZIP Compression provoquant l'expiration de la page Web

protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     if (Internet.Browser.IsGZIPSupported()) 
     { 
      base.Response.Filter = new GZipStream(base.Response.Filter, CompressionMode.Compress, true); 
      base.Response.AppendHeader("Content-encoding", "gzip"); 
      base.Response.AppendHeader("Vary", "Content-encoding"); 
     } 
     else if (Internet.Browser.IsDeflateSupported()) 
     { 
      base.Response.Filter = new DeflateStream(base.Response.Filter, CompressionMode.Compress, true); 
      base.Response.AppendHeader("Content-encoding", "deflate"); 
      base.Response.AppendHeader("Vary", "Content-encoding"); 
     } 
    } 

le procédé IsGZIPSupported détermine simplement si le navigateur prend en charge GZIP, en regardant la tête de demande codant Veuillez agréer, et l'agent utilisateur du navigateur (IE5-6 sont exclus de compression gzip). Toutefois, avec ce code, je reçois la page Web a expiré message dans IE, lorsque je postback de la page et essayez d'utiliser le bouton de retour. Réglage du contrôle de cache privé semble résoudre le problème:

base.Response.Cache.SetCacheability(HttpCacheability.Private); 

Mais je ne sais pas pourquoi, ou si cela va causer d'autres problèmes. Je n'ai pas défini de mise en cache pour les autres pages du site et le site fonctionne sur un intranet avec seulement une douzaine d'utilisateurs simultanés. La performance n'est donc pas un gros problème pour le moment.

+0

Pourquoi ne pas simplement l'activer dans IIS? http://weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx – cjk

+0

@ck: Il n'est pas toujours possible d'accéder à la console IIS, par ex. vous hébergez votre site sur un hôtel Web ou vous développez un site hébergé par une autre société, et vous ne croyez pas vraiment savoir comment configurer IIS. –

+0

Malheureusement, je n'ai pas un accès administrateur complet au serveur. –

Répondre

2

See this article sur Vary tête et WinInet/MSIE

Il semble que vous devriez envoyer Vary: Accept-Encoding au lieu de Vary: Content-Encoding, que la réponse varie en fonction de la demande tête.

+0

Est-il important que j'ignore essentiellement l'en-tête de requête Accept-Encoding pour IE6? –

+0

En fait, en y réfléchissant, ça ne devrait pas avoir d'importance car IE6 n'a aucune idée que les pages peuvent être compressées en GZIP. –

+0

Non, cela ne devrait pas avoir d'importance. Accept-Encoding signifie "I * peut * gérer ces encodages", mais vous êtes libre d'ignorer cette fonctionnalité et de servir la version simple. – Piskvor

Questions connexes