Como habilito a compactação gzip ao usar MVC3 no IIS7?

100

Alguém sabe habilitar a compactação gzip no MVC 3? Estou usando o IIS7.

Resultado da auditoria do Google Chrome:

  1. Ativar compactação gzip (4)
  2. Compactar os seguintes recursos com gzip pode reduzir seu tamanho de transferência em cerca de dois terços (~ 92,23 KB):
  3. / mydomain / pode economizar cerca de 1,53 KB
  4. jquery-1.4.4.min.js pode economizar cerca de 51,35 KB
  5. Cufon.js pode economizar cerca de 11,89 KB
  6. Futura.js pode economizar cerca de 27,46 KB
imarkic84
fonte
Não
acalme

Respostas:

142

Você pode configurar a compactação por meio de seu web.configarquivo da seguinte maneira:

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

Você pode encontrar a documentação desse elemento de configuração em iis.net/ConfigReference . Isso é equivalente a:

  1. Abrindo Internet Information Services (IIS Manager)
  2. Navegando pela visualização em árvore à esquerda até chegar ao diretório virtual que deseja modificar
  3. Selecionar o diretório virtual apropriado para que o título do painel direito se transforme no nome desse diretório virtual.
  4. Escolhendo "Compressão" em "IIS" no painel direito
  5. Marque ambas as opções e escolha "Aplicar" em "Ações" à direita.

Nota: (como apontado nos comentários) você precisa se certificar de que o Http Dynamic Compression está instalado, caso contrário,doDynamicCompression="true" não terá nenhum efeito. A maneira mais rápida de fazer isso é:

  1. Iniciar> Tipo optionalfeatures (esta é a maneira mais rápida de chegar à janela "Ativar ou desativar recursos do Windows")
  2. Navegue até Serviços de Informações da Internet> Serviços da World Wide Web> Recursos de Desempenho na visualização em árvore "Recursos do Windows"
  3. Certifique-se de que a opção "Dynamic Content Compression" esteja marcada
  4. Clique em "Ok" e aguarde enquanto o Windows instala o componente
Roubar
fonte
11
É importante notar que você precisa ter a opção Http Compression Dynamic IIS instalada para que isso funcione. O link de referência de configuração nesta resposta contém os detalhes.
Caleb Vear
16
No Windows Server 2008 optionalfeaturesnão funcionou para mim. Em vez disso, navegue até Gerenciador de servidores> Funções> Role até Servidor da Web (IIS)> clique em Adicionar serviços de função. Agora certifique-se de que Servidor da Web> Desempenho> Compressão de conteúdo estático e Compressão de conteúdo dinâmico estejam instalados.
Rory
1
Esteja ciente de que isso pode bagunçar seu cabeçalho de host "Vary:". Mais informações: stackoverflow.com/questions/5372052/…
jjxtra
2
Pelo menos na minha experiência, isso compacta tudo, exceto a saída dos controladores MVC. Por algum motivo, eles retornam HTML sem nenhuma compactação gzip.
Chris Moschini
1
Cuidado !!! A compressão dinâmica do IIS remove cabeçalhos Vary, é um bug ou recurso, não sei, mas implementar o filtro personalizado faz mais sentido se você deseja que o cache funcione corretamente.
Akash Kava
31

Você poderia fazer isso em código, se preferir. Eu faria um controlador básico do qual todo controle herda e o decoraria com o atributo abaixo.

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
fonte
2
@JustAnotherUserYouMayKnow - depende de como você está servindo aos seus recursos; se você estiver apontando diretamente para arquivos no servidor, não; no entanto, se você atendê-los por meio de ações (como nosso sistema de gerenciamento de recursos nos permite), funciona perfeitamente. BTW Rick Strahl atualizou isso para verificar se o cliente realmente suporta gzip antes de compactar
Paul Carroll
4
Observe que, para redirecionar, é importante se proteger contra o filterser nulo. Eu usei var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
Além disso, você pode querer usar gzipprimeiro em vez de deflate, leia mais aqui: stackoverflow.com/a/9856879/1026459
Travis J
O IIS armazena em cache os arquivos compactados, portanto, não será necessário compactá-los novamente para obter um melhor desempenho. Use o IIS se puder e só use essa abordagem se a compactação do IIS não estiver disponível para você.
Muhammad Rehan Saeed
1
Nenhuma dessas soluções funciona em MVC5, IIS 8.5, .Net 4.5 Localhost. O que devo fazer, alguma sugestão?
aadi1295
12

A compactação é habilitada / desabilitada no nível do servidor. Consulte o módulo de compactação IIS no console de gerenciamento iis.

Aqui estão as instruções para o IIS no site da Microsoft.

nakhli
fonte
1
Você também pode defini-lo no web.config
Jack Marchetti,