Habilitar la compresión dinámica (GZIP) para JSON en IIS/IIS Express

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:

%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

Manualmente, modificando el archivo de configuración (applicationHost.config) del IIS de Windows (%windir%System32inetsrvconfig) o IIS Express (%userprofile%my documentsiisexpressconfig):

<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>

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:

JSON sin comprimir

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:

JSON comprimido

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!