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.