En nuestro escenario actual en el que nos movemos entre sitios web y aplicaciones, viendo al mundo alrededor cambiar solo nos queda muy claro que no tenemos mucho tiempo que perder, en ese contexto los que desarrollamos las aplicaciones de hoy necesitamos asegurarnos que estas sean lo mas rápido posibles.

Hoy quiero contarles cómo implementar la compresión GZIP y deflate en las respuestas de nuestros servicios Web Api 2, de esta manera reduciremos el tamaño de las respuestas (generalmente JSON) que enviamos al cliente, reduciendo el uso de ancho de banda.

Manos a la obra

  1. Tengo una aplicación web creada para este ejemplo, AdventureWeb, que carga la información de empleados del endpoint Web Api. Pueden ver el peso de la repuesta y el tiempo que tarda en cargarse (con una velocidad de 50 KB/s y una latencia de 500ms): 19.41 s.

  2. Si vemos en más detalle la solicitud y respuesta. El navegador envío la cabecera para avisarle a nuestro servicio web que soportaba la compresión del contenido (Accept-Encoding). Pero la respuesta se devolvió sin compresión.

  3. Para poder resolver este problema, empezaremos instalando un paquete nuget en nuestro proyecto de WebAPI.

     PM> Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression
    

Este paquete nos ayudara a habilitar la compresión del contenido y puedes instalarlo via el Nuget Package Manager.

  1. Ahora que tenemos el paquete instalado, debemos proceder a configurarlo para que realice la compresión del contenido, para esto debemos editar la configuración de WebApi, generalmente la tenemos en un archivo WebApiConfig.cs en el App_Start si utilizamos la plantilla base de asp.net. Es posible hacer esta configuración dentro de nuestra clase Startup también pero se recomienda organizar esta configuración aquí.

  2. Agregamos los siguientes using para reconocer las clases que usaremos.

     using Microsoft.AspNet.WebApi.MessageHandlers.Compression;
     using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors;
    
  3. La configuración requerida es registrar nuestro MessageHandler para que sea el primer manejador de mensajes.

     GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    

Nuestro WebApiConfig.cs debería lucir así:

7. Ahora ejecutamos nuestro sitio y probemos que tanto ha mejorado el desempeño.

Comparando los resultados...

Teniendo la compresión GZIP habilitada, vemos una reducción del 85% tamaño de la respuesta, la cual ahora solo consta de 17.6 KBs lo que toma 3.55s en una red de 50KB/s y 500ms de latencia, la misma que utilice en la prueba inicial.

Comparación
Sin compresión Con compresión
Tamaño 119 KBs 17.6 KBs
Tiempo 19.41 s 3.55 s

Genial verdad? ;) #happyCoding