2009-02-16 21 views
72

Estoy tratando de implementar la compresión GZip para mi página asp.net (incluidos mis archivos CSS y JS). He probado el siguiente código, pero sólo comprime mi página .aspx (que se encuentra desde YSlow)¿Cómo implementar la compresión GZip en 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; 

El código anterior sólo está comprimiendo mi código de la página .aspx (marcado) no es el CSS y JS que se incluye como archivos externos. Por favor, dígame cómo puedo implementar la compresión GZip en ASP.NET usando código (porque estoy en el servidor de alojamiento compartido donde no tengo acceso a las configuraciones del Servidor IIS). Y también en el código anterior no estoy obteniendo las dos últimas líneas, por qué se usan y cuál es el propósito de estas líneas. ¡Por favor explique!

Gracias

Respuesta

26

para la compresión de archivos JS & CSS en realidad se tienen que manejar que a nivel de IIS, ya que estos archivos son prestados directamente sin el tiempo de ejecución de ASP.NET.

se puede hacer una asignación de extensión JSX & CSSX en IIS para el aspnet_isapi.dll y luego tomar ventaja de su código postal, pero es probable que hacer un mejor trabajo de esto para usted IIS.

El encabezado de codificación de contenido le dice al navegador que necesita descomprimir el contenido antes de representarlo. Algunos navegadores son lo suficientemente inteligentes como para resolver esto de todos modos, según la forma del contenido, pero es mejor simplemente contarlo.

La configuración de caché de codificación de aceptación está allí para que una versión en caché del contenido comprimido no se envíe a un navegador que solo solicitó texto/html.

+4

Hola @Ben, ¿Puedes decirme cómo comprimir mis archivos usando IIS? ¿Qué ajustes debo realizar? Aunque no tengo acceso a las configuraciones de IIS, pero me ' Intentare hacerlo ¿Dime cómo comprimir archivos usando IIS? ¡Gracias! – Prashant

+3

http://stackoverflow.com/a/6992948/8479 detalla el simple cambio en web.config que se necesita para IIS 7 o superior. – Rory

2

Para responder a su última pregunta. Esas dos líneas establecen encabezados HTTP para la respuesta enviada de vuelta al navegador. Content-Encoding le dice al navegador que la respuesta está codificada como gzip y necesita ser decodificada. La última línea agrega Accept-Encoding al Vary header. Con esto, el navegador o los proxies pueden determinar si la respuesta fue única o está influenciada por ciertos otros encabezados y ajustar su almacenamiento en caché.

3

En IIS7 todas las solicitudes van a .net, por lo que tendría que crear un HttpModule que agregara esos encabezados a todas las respuestas.

Sin IIS7, y en alojamiento compartido, tendría que crear un controlador que mapeó una extensión de archivo .net que no está utilizando (como .asmx) y en el archivo web.config especificar que los archivos .asmx van a su HttpHandler, que está configurado para reescribir la ruta a .jpg o lo que sea, y establecer el encabezado allí también.

11

La razón por la que solo comprime su archivo ASPX es porque el código que ha escrito solo está incrustado en el archivo ASPX. Un archivo ASPX es una solicitud separada de cualquier contenido vinculado que contiene. Así que si usted tiene una página ASPX que contiene:

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

esto equivaldría a 2 solicitudes (búsquedas de DNS a un lado) de su navegador para los recursos:

  1. para la página aspx y
  2. de la imagen contenida en la página aspx.

Cada solicitud tiene su propia respuesta steam. El código que ha publicado se adjunta únicamente a la secuencia de respuesta ASPX, por lo que solo se está comprimiendo su página ASPX.Las líneas 1 & 2 de su código publicado básicamente toman el flujo de respuesta normal de la página e inyectan un código de "intermediario" que en este caso come y comprime el flujo de salida normal con un flujo GZip y lo envía por el cable.

Líneas 3 & 4 están configurando los encabezados de respuesta. Todas las solicitudes y respuestas http tienen encabezados que se envían antes del contenido. Estos configuran la solicitud/respuesta para que el servidor y el cliente sepan qué se envía y cómo.

En este caso, la línea 3 informa al navegador del cliente que el flujo de respuesta se comprime mediante gzip y, por lo tanto, debe ser descomprimido por el navegador del cliente antes de visualizarse.

Y la línea 4 simplemente está activando el encabezado Aceptar codificación de la respuesta. Esto, de otro modo, habría estado ausente de la respuesta.

Hay módulos enchufables que puede escribir/obtener que le permiten comprimir una multitida de otro tipo MIME como * .js y * .css, pero es mejor que simplemente utilice la funcionalidad de compresión integrada de IIS.

No has dicho, que Verson de IIS que está utilizando, pero si se tratara de IIS 7.0, se requeriría que incluya algo como lo siguiente en la sección <system.webserver> de que el archivo 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

Descripciones realmente asombrosas – Rakeshyadvanshi

37

Aquí está la solución para los archivos CSS y 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> 

Crédito: How to GZip on ASP.NET and GoDaddy

+0

This One works .. –

+0

necesita verificar .... –

+2

la última línea debe eliminarse – JeffT

11

esto puede ser útil para que lo pruebe, este acepta desinflarse y la compresión 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

Muchas gracias por este código. Necesitaba descomprimir/desinflar el contenido de un sitio específico, no tengo acceso a la consola de IIS y esto me ayudó. Sólo una pregunta, sin embargo: Este código parece estar desinflando todos los archivos aspx y gziping CSS y ScriptResources, pero no se gziping los archivos .js. ¿Hay alguna manera de hacer eso? Gracias. –

+0

Esto es incorrecto, ya que no está manejando instrucciones de calidad como esta: 'gzip; q = 0, deflate'. http://www.singular.co.nz/2008/07/finding-preferred-accept-encoding-header-in-csharp/ – oligofren

0

Añadir .aspx extensión .css o archivo .js. Use <% @ Page ContentType = "text/css"%> o javascript dentro del archivo para publicarlo con el tipo MIME correcto. & use Reescritura de URL para ocultar esto de los navegadores del agente de usuario. El encabezado de respuesta de codificación de contenido se adjunta gzip para transmitir que gzip es el método utilizado para realizar la compresión. Variar encabezado de respuesta establecido en Aceptar-Codificación para que todos los cachés sepan qué página (comprimida o no comprimida) debe ser servida depende del encabezado Aceptación-Codificación de la solicitud. Ya lo he explicado al https://stackoverflow.com/a/14509007/1624169

Cuestiones relacionadas