¿Cómo habilito la compresión gzip cuando uso MVC3 en IIS7?

100

¿Alguien sabe cómo habilitar la compresión gzip en MVC 3? Estoy usando IIS7.

Resultado de Google Chrome Audit:

  1. Habilitar la compresión gzip (4)
  2. Comprimir los siguientes recursos con gzip podría reducir su tamaño de transferencia en aproximadamente dos tercios (~ 92.23KB):
  3. / midominio / podría ahorrar ~ 1,53 KB
  4. jquery-1.4.4.min.js podría ahorrar ~ 51.35KB
  5. Cufon.js podría ahorrar ~ 11.89KB
  6. Futura.js podría ahorrar ~ 27.46KB
imarkic84
fuente
No es un duplicado silencioso: stackoverflow.com/q/552317/712526
jpaugh

Respuestas:

143

Puede configurar la compresión a través de su web.configarchivo de la siguiente manera:

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

Puede encontrar documentación de este elemento de configuración en iis.net/ConfigReference . Este es el equivalente de:

  1. Apertura de Servicios de información de Internet (Administrador de IIS)
  2. Navegando por la vista de árbol de la izquierda hasta llegar al directorio virtual que desea modificar
  3. Seleccionar el directorio virtual apropiado para que el título del panel de la derecha se convierta en el nombre de dicho directorio virtual.
  4. Elegir "Compresión" en "IIS" en el panel de la derecha
  5. Marcando ambas opciones y eligiendo "Aplicar" en "Acciones" en el extremo derecho.

Nota: (Como se señaló en los comentarios) Debe asegurarse de que Http Dynamic Compression esté instalado, de lo contrario, configuredoDynamicCompression="true" no tendrá ningún efecto. La forma más rápida de hacerlo es:

  1. Inicio> Tipo optionalfeatures (esta es la forma más rápida de acceder a la ventana "Activar o desactivar las funciones de Windows")
  2. Vaya a Servicios de información de Internet> Servicios World Wide Web> Funciones de rendimiento en la vista de árbol "Funciones de Windows".
  3. Asegúrese de que "Compresión de contenido dinámico" esté marcado
  4. Haga clic en "Aceptar" y espere mientras Windows instala el componente
Robar
fuente
11
Vale la pena señalar que debe tener instalada la opción Http Compression Dynamic IIS para que esto funcione. El enlace de referencia de configuración en esta respuesta tiene los detalles.
Caleb Vear
16
En Windows Server 2008 optionalfeaturesno funcionó para mí. En su lugar, vaya a Administrador del servidor> Roles> Desplácese hasta Servidor web (IIS)> haga clic en Agregar servicios de rol. Ahora asegúrese de que Web Server> Performance> Static Content Compression y Dynamic Content Compression estén instalados.
Rory
1
Tenga en cuenta que esto puede estropear su encabezado de host "Vary:". Más información: stackoverflow.com/questions/5372052/…
jjxtra
2
Al menos en mi experiencia, esto comprime todo PERO la salida de los controladores MVC. Por alguna razón, devuelven HTML sin ninguna compresión gzip.
Chris Moschini
1
Precaución !!! IIS Dynamic Compression elimina los encabezados Vary, es un error o una característica, no lo sé, pero implementar un filtro personalizado tiene más sentido si desea que la caché funcione correctamente.
Akash Kava
31

Puede hacer esto en código si prefiere hacerlo. Haría un controlador base del que hereda cada control y lo decoraría con este atributo a continuación.

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}
NetProvoke
fuente
2
@JustAnotherUserYouMayKnow: depende de cómo esté sirviendo sus recursos; si está apuntando directamente a archivos en el servidor, entonces no, sin embargo, si los sirve a través de acciones (como nos permite nuestro sistema de administración de recursos), entonces funciona de manera brillante. Por cierto, Rick Strahl ha actualizado esto para admitir la verificación de que el cliente realmente admite gzip antes de comprimir
Paul Carroll
4
Tenga en cuenta que para redirigir es importante protegerse contra el filterser nulo. Yo usé var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
Además, es posible que desee usar gzipprimero en lugar de deflate, lea más aquí: stackoverflow.com/a/9856879/1026459
Travis J
IIS almacena en caché los archivos comprimidos, por lo que no tendrá que volver a comprimirlos para obtener un mejor rendimiento. Use IIS si puede y solo use este enfoque si la compresión IIS no está disponible para usted.
Muhammad Rehan Saeed
1
Ninguna de estas soluciones funciona en MVC5, IIS 8.5, .Net 4.5 Localhost. ¿Qué debo hacer, alguna sugerencia?
aadi1295
12

La compresión está habilitada / deshabilitada a nivel del servidor. Consulte el módulo de compresión de IIS en la consola de administración de iis.

Aquí están las instrucciones para IIS del sitio de microsoft.

nakhli
fuente
1
También puede configurarlo en web.config
Jack Marchetti