2009-02-16 24 views
72

Sto cercando di implementare la compressione GZip per la mia pagina asp.net (compresi i miei file CSS e JS). Ho provato il seguente codice, ma comprime solo la mia pagina aspx (trovato da YSlow)Come implementare la compressione GZip in ASP.NET?

HttpContext context = HttpContext.Current; 
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); 
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); 
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true; 

Il codice di cui sopra è solo comprime il mio codice pagina aspx (markup) non il file CSS e JS che è incluso come file esterni. Per favore dimmi come posso implementare la compressione GZip in ASP.NET usando il codice (perché sono su un server di hosting condiviso dove non ho accesso alle configurazioni del server IIS). E anche nel codice di cui sopra non sto ottenendo le ultime due righe, perché sono usate e qual è lo scopo di queste righe. Spiega per favore!

Grazie

risposta

26

per la compressione di file JS & CSS in realtà si deve gestire che a livello di IIS, dal momento che questi file sono resi direttamente senza il runtime di ASP.NET.

È possibile creare un mapping di estensione CSSX JSX & in IIS su aspnet_isapi.dll e quindi sfruttare il proprio codice di avviamento postale, ma è probabile che IIS esegua un lavoro migliore di questo per conto dell'utente.

L'intestazione di codifica del contenuto indica al browser che è necessario decomprimere il contenuto prima del rendering. Alcuni browser sono abbastanza intelligenti da capirlo comunque, in base alla forma del contenuto, ma è meglio semplicemente raccontarlo.

L'impostazione della cache di codifica Accept è disponibile in modo che una versione memorizzata nella cache del contenuto gzip non venga inviata a un browser che ha richiesto solo testo/html.

+4

Ciao @ Ben, puoi dirmi come comprimere i miei file usando IIS, quali sono le impostazioni che devo eseguire, anche se non ho accesso alle configurazioni di IIS, ma io? Proverò a farlo. Per favore dimmi come comprimere i file usando IIS ?? Grazie! – Prashant

+3

http://stackoverflow.com/a/6992948/8479 descrive la semplice modifica a web.config necessaria per IIS7 o versioni successive. – Rory

2

Per rispondere alla tua ultima domanda. Queste due righe impostano le intestazioni HTTP per la risposta inviata al browser. Content-Encoding indica al browser che la risposta è codificata come gzip e deve essere decodificata. L'ultima riga aggiunge Accept-Encoding allo Vary header. Con questo il browser o i proxy possono determinare se la risposta è unica o è influenzata da alcune altre intestazioni e regolare la cache.

3

In IIS7 tutte le richieste vengono inoltrate a .net, quindi è necessario creare un HttpModule che aggiunga quelle intestazioni a tutte le risposte.

Senza IIS7 e su hosting condiviso, è necessario creare un gestore che ha associato un'estensione di file .net che non si sta utilizzando (come .asmx) e nel file web.config specificare che i file .asmx vengono inviati al proprio HttpHandler che è impostato per riscrivere il percorso di .jpg o altro e impostare anche l'intestazione.

11

Il motivo per cui è solo la compressione del file ASPX è che il codice che hai scritto è solo incorporato nel file ASPX. Un file ASPX è una richiesta separata da qualsiasi contenuto collegato che contiene. Quindi, se si dispone di una pagina ASPX che contiene:

<img src="www.example.com\exampleimg.jpg" alt="example" /> 

ciò equivarrebbe a 2 richieste (DNS lookup a parte) dal tuo browser per le risorse:

  1. per la pagina aspx e
  2. per l'immagine contenuta nella pagina di aspx.

Ogni richiesta ha il proprio vapore di risposta. Il codice che hai postato si collega solo al flusso di risposta ASPX, motivo per cui solo la tua pagina ASPX viene compressa.Righe 1 & 2 del vostro codice postato stanno essenzialmente prendendo il normale flusso di risposta della pagina e iniettando un codice "uomo medio" che in questo caso mangia e comprime il normale flusso di output con un flusso GZip e lo invia invece sul filo.

Righe 3 & 4 stanno configurando le intestazioni di risposta. Tutte le richieste e le risposte http hanno intestazioni inviate prima del contenuto. Questi impostano la richiesta/risposta in modo che il server e il client sappiano cosa viene inviato e come.

In questo caso, la riga 3 informa il browser del client che il flusso di risposta è compresso tramite gzip e che pertanto deve essere deselezionato dal browser client prima della visualizzazione.

E la riga 4 sta semplicemente accendendo l'intestazione Accept-Encoding della risposta. Questo sarebbe stato altrimenti assente dalla risposta.

Ci sono moduli collegabili che è possibile scrivere/ottenere che consentono di comprimere un multitide di altro tipo MIME come * .js e * .css ma è meglio usare solo la funzionalità di compressione integrata di IIS.

Non hai detto che verson di IIS che si sta utilizzando, ma se si trattasse di IIS 7.0, sarebbe necessario includere qualcosa di simile a quanto segue nella sezione <system.webserver> di voi file web.config:

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
<staticTypes> 
     <add mimeType="text/*" enabled="true" /> 
     </staticTypes> 
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

Richard

+0

Descrizioni davvero stupende – Rakeshyadvanshi

37

Ecco la soluzione per i file CSS e JavaScript

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/> 
    <dynamicTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </dynamicTypes> 
    <staticTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </staticTypes> 
    </httpCompression> 
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/> 
</system.webServer> 

Credito: How to GZip on ASP.NET and GoDaddy

+0

Questo funziona .. –

+0

necessita di controllo .... –

+2

l'ultima riga deve essere rimossa – JeffT

11

questo può essere utile per provarlo, questo accetta la compressione di deflate e gzip.

void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
     string acceptEncoding = app.Request.Headers["Accept-Encoding"]; 
     Stream prevUncompressedStream = app.Response.Filter; 

     if (app.Context.CurrentHandler == null) 
      return; 

     if (!(app.Context.CurrentHandler is System.Web.UI.Page || 
      app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || 
      app.Request["HTTP_X_MICROSOFTAJAX"] != null) 
      return; 

     if (acceptEncoding == null || acceptEncoding.Length == 0) 
      return; 

     acceptEncoding = acceptEncoding.ToLower(); 

     if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") 
     { 
      // deflate 
      app.Response.Filter = new DeflateStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "deflate"); 
     } 
     else if (acceptEncoding.Contains("gzip")) 
     { 
      // gzip 
      app.Response.Filter = new GZipStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "gzip"); 
     } 
    } 
+1

Grazie mille per questo codice. Avevo bisogno di gzip/sgonfiare il contenuto di un sito specifico che non ho accesso alla console di IIS e questo mi ha aiutato. Solo una domanda: questo codice sembra sgonfiare tutti i file aspx e gziping CSS e ScriptResources, ma non gziping dei file .js. C'è un modo per farlo? Grazie. –

+0

Questo è sbagliato, poiché non si sta gestendo un'istruzione di qualità come questa: 'gzip; q = 0, deflate'. http://www.singular.co.nz/2008/07/finding-preferred-accept-encoding-header-in-csharp/ – oligofren

0

Aggiungi estensione .aspx al file .css o .js. Usa <% @ Page ContentType = "text/css"%> o javascript nel file per servirlo con il tipo MIME corretto. & utilizza l'URL Riscrivi per nascondere questo dai browser degli agenti utente. L'intestazione della risposta di codifica del contenuto viene aggiunta gzip per comunicare che gzip è il metodo utilizzato per eseguire la compressione. L'intestazione di risposta varia è impostata su Accept-Encoding, quindi tutte le cache sanno quale pagina (compressa o non compressa) deve essere pubblicata, a seconda dell'intestazione Accept-Encoding della richiesta. Ho elaborato questo a https://stackoverflow.com/a/14509007/1624169