2010-09-27 4 views
35

jak skompresować dane wyjściowe wysyłane przez aplikację asp.net mvc?jak spakować zawartość w asp.net MVC?

+0

Dlaczego nie wystarczy ustawić '' 'lub nawet ' 'web.comfig' w http://www.iis.net/configreference/system.webserver/httpcompression http://stackoverflow.com/questions/9235337/gzipping-content-files-in-asp-net-mvc-3? – Kuncevic

Odpowiedz

83

Oto co mogę użyć (jak tego monent w czasie):

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

użytkowania w kontrolerze:

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

Istnieją inne warianty, ale działa to całkiem dobrze. (Btw, używam [Compress] atrybut na moim BaseController zapisać powielania całego projektu, natomiast powyżej robi to na kontrolerze przez podstawę regulatora.

[Edytuj] jak wspomniano w ust powyżej. Do uproszczenie wykorzystania, można także [Compress] Oneshot w samej BaseController, co każdy dziedziczone kontroler dziecko ma dostęp do funkcjonalności domyślnie.

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

sama koncepcja :) prawie identyczny kod – veggerby

+0

faktycznie, spojrzał na twój przykład - bardzo podobny - straszny :). Używam tego kodu od ponad roku, więc mogę sprawdzić, czy działa bardzo dobrze ... –

+0

jest możliwe, mogę zrobić niektóre ustawienia w web.config, aby zrobić kompresję. jeszcze jedna rzecz, którą chcę wiedzieć, jak sprawdzić, jak bardzo narzut jest dodawany do serwera przez kod kompresji, który tutaj uruchamiamy. –

5

Zapraszamy do obejrzenia tego artykułu, który nakreśla sposób sprytne wykorzystanie Filtry Action

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

np

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

I jako bonus, to zawiera również CacheFilter

+0

okie, testowanie tego, jeszcze jedna rzecz, którą chcę wiedzieć, w jaki sposób mogę sprawdzić, czy dane otrzymywane z serwera są gzipowane czy nie? –

+0

Użyj Firebug tak jak w artykule i spójrz na nagłówek odpowiedzi – veggerby

+1

Nie działa w MVC5, IIS 8.5 i .Net 4.5, każda pomoc będzie doceniona. –