Habilitar compresión Gzip-Deflate en nuestras páginas ASP .NET 2.0 y C#

Entremos en materia

La salida de la mayoría de páginas web desde el servidor web es en forma de texto (en términos de HTTP, el content-type es "text/html"). Este texto es recibido por el navegador del cliente, que lo interpreta y muestra el resultado en pantalla. Como ya sabréis todos, esta comunicación entre cliente y servidor consume ancho de banda, ya que se realiza a través de Internet.

Por ejemplo, una página que ocupa exactamente 50KB consumirá aproximadamente unos 50KB de ancho de banda (un poco más debido a las cabeceras HTTP adicionales).

¿Y cómo podríamos hacer para ahorrar ancho de banda?

Pues es muy sencillo, y aquí es donde entran en juego la compresión Gzip y Deflate de HTTP.

En el ejemplo anterior teníamos una página web de 50 KB. Si la comprimimos utilizando compresión Gzip o Deflate puede quedarse en unos 15 o 18 KB, es decir, ahorraríamos aproximadamente el 33% de ancho de banda.

El ahorro puede parecer poco si nuestro servidor solo recibe unas pocas peticiones al día. Sin embargo, si nuestro servidor recibe cientos de miles de peticiones y lo que es más, si tenemos el ancho de banda limitado, un ahorro del 33% puede ser muy importante.

¡Estupendo! ¿Y cómo consigo comprimir mis páginas con Gzip-Deflate?

Para implementar la compresión de páginas en nuestra aplicacion ASP .NET, haremos uso de los eventos a nivel de aplicación que nos permite utilizar un fichero Global.asax. Si ya tenéis un fichero Global.asax o Global.asax.cs probáblemente ya sabréis que hacer con el siguiente fragmento de código, pero por si acaso vamos a verlo más detalladamente.

Un fichero Global.asax se sitúa en el directorio raíz de la aplicación y contiene métodos para manejar los eventos del ciclo de vida de una aplicación web ASP .NET. En este artículo nos vamos a centrar en el evento de aplicación ‘BeginRequest‘, que es el primer evento que tiene lugar cuando ASP .NET responde a una petición.

¿Y el código?

Veamos primero el código del fichero Global.asax:

 1 <%@ Application Language="C#" %>
 2 <%@ Import Namespace="System.IO" %>
 3 <%@ Import Namespace="System.IO.Compression" %>
 4 
 5 <script runat="server">
 6 protected void Application_BeginRequest(object sender, EventArgs e) {
 7   HttpApplication app = (HttpApplication)sender;

 8   string acceptEncoding = app.Request.Headers["Accept-Encoding"];
 9   Stream prevUncompressedStream = app.Response.Filter;
10 
11   if (acceptEncoding == null || acceptEncoding.Length == 0) {
12     return;
13   }
14 
15   acceptEncoding = acceptEncoding.ToLower();
16 
17   if ( app.Context.Request.FilePath.EndsWith(".aspx") || app.Context.Request.FilePath.EndsWith(".ashx") ) {
18     if (acceptEncoding.Contains("gzip")) { // gzip
19       app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
20       app.Response.AppendHeader("Content-Encoding", "gzip");
21     } else if (acceptEncoding.Contains("deflate")) { // defalte
22       app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
23       app.Response.AppendHeader("Content-Encoding", "deflate");
24     }
25   }
26 } 
27 </script>

Y ahora lo explicamos un poco:

  • Primero importamos los ‘namespaces’ que vamos a necesitar, donde se encuentran las clases GZipStream y DeflateStream, que son nuevas en ASP .NET 2.0 (líneas 2-3).
  • Obtenemos un objeto del tipo HttpApplication, que en este caso es quien lanza el evento (línea 7).
  • Utilizando el objeto anterior, buscamos entre las cabeceras enviadas por el navegador del cliente aquella que nos diga si acepta compresión (Accept-Enconding). Si la cabecera es null quiere decir que no acepta compresión (líneas 8-13).
  • Sólo comprimimos si el contenido solicitado es .aspx o .ashx (línea 17).
  • Comprobamos primero si el navegador del cliente acepta compresión GZip (línea 18).
  • Si acepta compresión GZip, crearemos un nuevo GZipStream que se encargará de comprimir la salida de la página web antes de enviarla (líneas 19 y 20).
  • Si el cliente no acepta compresión GZip, lo intentaremos con Deflate (líneas 21-23).

¡Listo!

Pues ya está todo listo. Con los cambios anteriores, nuestrás páginas .aspx serán comprimidas antes de ser enviadas a través de Internet para ser recibidas por el navegador del cliente, que se encargará de descomprimir automáticamente los datos antes de mostrarlos por pantalla.

Nuestra puntuación
Twittear
Compartir
Compartir
Pin