Una buena práctica cuando configuramos un servidor web es habilitar la compresión para las peticiones HTTP. En este post voy a hablar sobre cómo podemos comprimir las peticiones de tipo JSON a través de GZIP.
Configuración
Lo único que tenemos que hacer es incluir dentro del apartado httpCompression del archivo de configuración del servidor web el apartado dynamicTypes, en el caso de que no existiera, e incluir los mime types de las peticiones que queremos comprimir. Esta operación se puede realizar de varias maneras:
A través de consola con appcmd:
[plain]%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType=’application/json’,enabled=’True’]" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType=’application/json; charset=utf-8′,enabled=’True’]" /commit:apphost
[/plain]
Manualmente, modificando el archivo de configuración (applicationHost.config) del IIS de Windows (%windir%System32inetsrvconfig) o IIS Express (%userprofile%my documentsiisexpressconfig):
[xml highlight=»12,13″]<httpCompression directory="%SystemDrive%inetpubtempIIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%system32inetsrvgzip.dll" />
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</staticTypes>
<dynamicTypes>
<add mimeType="application/json; charset=utf-8" enabled="true" />
<add mimeType="application/json" enabled="true" />
</dynamicTypes>
</httpCompression>[/xml]
O bien través de la interfaz de administración de IIS, donde sería necesario activar el módulo Dynamic Content Compression. En este punto serían necesarios más pasos y creo que es más tedioso.
Resultados
Para que veamos claro cuál es el beneficio de la configuración anterior, en la siguiente imagen se muestra una petición donde el contenido no ha sido comprimido:
Esto significa que la respuesta de esa petición tiene un tamaño de 2.2 MB, lo cual es una penalización demasiado importante para nuestro sitio. Una vez aplicados los cambios y reiniciado el pool del IIS, podemos ver que se ha mejorado considerablemente el tamaño de las peticiones:
Si nos fijamos bien en la imagen anterior, en el apartado Size tenemos dos valores: el primero de ellos nos indica cuál es tamaño que se ha descargado del servidor remoto y el segundo cuál es el peso real del recurso. Otro dato importante, con el fin de detectar que nuestras peticiones se están comprimiendo, es el valor de la columna Content-Encoding (esta columna no está visible por defecto en Chrome), donde en la segunda imagen podemos comprobar que está utilizando gzip.
Espero que sea de utilidad.
¡Saludos!



También puedes hacer uso de un compresor como JSONH https://github.com/WebReflection/JSONH y la mejora se nota mucho.
Supongo que aplicando ambas técnicas la mejora aún será mayor.
Pero si no tienes poder para configurar el IIS o bien por temas de burocracia de un proyecto no tienes acceso, el uso de JsonH puede ser una alternativa
Un saludo,
¡Muchas gracias por el aporte David! Está genial tenerlo en cuenta.
¡Saludos!
Hola,
Congratulaciones por el tema, es verdaderamente importante en el mundo de dispositivos conectados en redes 3G/4G y todavía demasiadas veces olvidado.
Eso funciona para la descarga de datos, pero un tema que quiero investigar hace unas semanas es usando la librería PCL de Web Api 2 Client, como subir los POST y PUT usando compressión.
Muchas gracias por tu comentario Alberto,
Lo cierto es que no he utilizado esa librería… ¡esperamos tus impresiones!
¡Saludos!