2010-09-27 5 views
35

cómo comprimir la salida enviada por una aplicación asp.net mvc ??cómo descomprimir contenido en asp.net MVC?

+0

¿Por qué no establecer '' 'o incluso ' 'en web.comfig' http://www.iis.net/configreference/system.webserver/httpcompression http://stackoverflow.com/questions/9235337/gzipping-content-files-in-asp-net-mvc-3? – Kuncevic

Respuesta

83

Esto es lo que yo uso (a partir de este monento en el tiempo):

using System.IO.Compression; 

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); 
     } 
    } 
} 

uso en el controlador:

[Compress] 
public class BookingController : BaseController 
{...} 

hay otras variantes, pero esto funciona bastante bien. (Por cierto, yo uso el atributo [Comprimir] en mi BaseController para salvar la duplicación en todo el proyecto, mientras que el anterior se lo hace en un controlador de base del controlador.

[Editar] como se menciona en el párrafo anterior. A simplificar el uso, también puede incluir [Compress] uno-tiro en el propio BaseController, por lo tanto, todos los controladores de niño heredada accede a la funcionalidad por defecto:.

[Compress] 
public class BaseController : Controller 
{...} 
+0

mismo concepto :) código casi idéntico – veggerby

+0

en realidad, miró su ejemplo - muy similar de hecho - espeluznante :). He estado usando este código durante más de un año, por lo que puedo verificar que funciona muy bien ... –

+0

es posible que pueda hacer algunos ajustes en web.config para hacer la compresión. Una cosa más que quiero saber es cómo comprobar cuánto se agrega la sobrecarga al servidor mediante el código de compresión que estamos ejecutando aquí. –

5

Tener un vistazo a este artículo que describe un método ingenioso que utiliza filtros de acción

http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx

por ejemplo,

[CompressFilter] 
public void Category(string name, int? page) 

Y como un bono adicional, también incluye un CacheFilter

+0

okie, probando esto, una cosa más que quiero saber, ¿cómo puedo verificar si los datos que recibí del servidor de IAM son comprimidos o no? –

+0

Use Firebug como en el artículo y mire el encabezado de respuesta – veggerby

+1

No funciona en MVC5, IIS 8.5 y .Net 4.5, cualquier ayuda será apreciada. –