2010-01-22 5 views
0

J'ai utilisé le module complémentaire YSlow Firefox et il renvoie le résultat suivant:Grade D sur les composants de compression avec gzip

--------------------- -------------------------------------------------- ------------------
grade D sur les composants Compresser avec gzip

Il y a 3 éléments de texte brut qui doivent être envoyés comprimé

* http://localhost:63808/WebSite/BemVindo/ 
* http://localhost:63808/WebSite/css/Global.css?... 
* http://localhost:63808/WebSite/js/Global.js?... 

- -------------------------------------------------- --------------------------------------
Alors j'ai commencé à chercher et a obtenu ce morceau de code:

Global.asax

Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) 

    Dim Response As HttpResponse = HttpContext.Current.Response 
    Dim AcceptEncoding As String = HttpContext.Current.Request.Headers("Accept-Encoding") 

    If Not String.IsNullOrEmpty(AcceptEncoding) AndAlso AcceptEncoding.Contains("gzip") OrElse AcceptEncoding.Contains("deflate") Then 
     If AcceptEncoding.Contains("deflate") Then 
      Response.Filter = New System.IO.Compression.DeflateStream(Response.Filter, System.IO.Compression.CompressionMode.Compress) 
      Response.AppendHeader("Content-Encoding", "deflate") 
     Else 
      Response.Filter = New System.IO.Compression.GZipStream(Response.Filter, System.IO.Compression.CompressionMode.Compress) 
      Response.AppendHeader("Content-Encoding", "gzip") 
     End If 
    End If 

    Response.AppendHeader("Vary", "Content-Encoding") 

End Sub 

Et maintenant je:

Grade A sur les composants Compresser avec gzip

fin, fredonner? La question est: est l'événement Application_PreRequestHandlerExecute le meilleur endroit pour gzip/dégonfler les demandes?

+0

Je n'ai pas une réponse directe que je ne le fais pas IIS si je peux me tromper avec les « meilleures pratiques », mais vous * normalement * configurer ce au niveau du serveur web comme décrit ici http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/25d2170b-09c0-45fd-8da4-898cf9a7d568.mspx?mfr=true Par ailleurs, comment est le titre actuel "Ajouter les en-têtes Expires" en rapport avec la question? :) – BalusC

+0

Mais je n'ai pas de contrôle sur IIS ... le morceau de code fonctionne réellement, mais je suis inquiet si cela va surcharger les requêtes! Hé, j'ai changé le titre, c'était une autre question. – Fernando

Répondre

1

Oui, l'événement Application_PreRequestHandlerExecute est le meilleur endroit pour gzip/dégonfler les demandes.

2

Vous ne savez pas mais votre code peut provoquer des problèmes dans les pages utilisant Ajax. La page suivante affiche un code similaire mais annule la compression si Ajax est détecté: Enabling Gzip and Deflate HTTP Compression in ASP.NET pages. J'ai traduit le code en VB mais je ne l'ai pas essayé.

Eric

Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) 
Dim app As HttpApplication = TryCast(sender, HttpApplication) 
Dim acceptEncoding As String = app.Request.Headers("Accept-Encoding") 
Dim prevUncompressedStream As Stream = app.Response.Filter 

If Not (TypeOf app.Context.CurrentHandler Is Page OrElse app.Context.CurrentHandler.[GetType]().Name = "SyncSessionlessHandler") OrElse app.Request("HTTP_X_MICROSOFTAJAX") IsNot Nothing Then 
    Return 
End If 

If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then 
    Return 
End If 

acceptEncoding = acceptEncoding.ToLower() 

If acceptEncoding.Contains("deflate") OrElse acceptEncoding = "*" Then 
    ' defalte 
    app.Response.Filter = New DeflateStream(prevUncompressedStream, CompressionMode.Compress) 
    app.Response.AppendHeader("Content-Encoding", "deflate") 
ElseIf acceptEncoding.Contains("gzip") Then 
    ' gzip 
    app.Response.Filter = New GZipStream(prevUncompressedStream, CompressionMode.Compress) 
    app.Response.AppendHeader("Content-Encoding", "gzip") 
End If 

End Sub

Questions connexes