Compressão/Compactação HTTP via codigo .NET (HTTPModule)
Postado por Rafael | Postado em .NET, Desenvolvimento | Postado 18-08-2011
0
Abaixo vou colocar um exemplo de como ativar a compactação de pacotes HTTP via codigo, essa implementação teve um impacto de performance muito positivo:
Uma dica é que se a compactação do IIS estiver habilitada vai gerar problemas.
O Web.Config :
Você precisa adicionar a referencia para a classe, conforme abaixo(Pode ser diferente dependendo da versão do IIS):
<system.webServer> <modules> <add name="HTTPCompressionModule" type="Framework.Core.HTTPCompressionModule"></add> </modules> </system.webServer>
A classe:
using System; using System.IO; using System.IO.Compression; using System.Globalization; using System.Web; namespace Framework.Core { public class HTTPCompressionModule : IHttpModule { public HTTPCompressionModule() { } public void Dispose() { } public void Init(HttpApplication httpApplication) { httpApplication.PreRequestHandlerExecute += new EventHandler(Compress); } private bool isPathPermited(string strPath) { return (strPath.ToUpper().Contains(".ASPX") || strPath.ToUpper().Contains(".ASCX") || strPath.ToUpper().Contains(".ASP") || strPath.ToUpper().Contains(".HTML") || strPath.ToUpper().Contains(".HTM") || strPath.ToUpper().Contains(".CSS") || strPath.ToUpper().Contains(".JS") || strPath.ToUpper().Contains(".XML")); } private bool isContentTypeProhibited(string contentType) { return (contentType.ToUpper().Contains("APPLICATION/CSV")); } protected void Compress(object sender, EventArgs e) { HttpApplication httpApplication = (HttpApplication)sender; HttpRequest httpRequest = httpApplication.Request; HttpResponse httpResponse = httpApplication.Response; //#if DEBUG // return; //#endif if (!string.IsNullOrEmpty(httpResponse.ContentType.ToLower(CultureInfo.InvariantCulture))) { if (!((httpRequest.Browser.IsBrowser("IE")) && (httpRequest.Browser.MajorVersion <= 6))) { string acceptEncoding = httpRequest.Headers["Accept-Encoding"]; if (isPathPermited(httpRequest.Path) && !isContentTypeProhibited(httpRequest.ContentType)) if (!string.IsNullOrEmpty(acceptEncoding)) { acceptEncoding = acceptEncoding.ToLower(CultureInfo.InvariantCulture); if (acceptEncoding.Contains("gzip")) { if (httpResponse.Headers["Content-encoding"] == null) { httpResponse.Filter = new GZipStream(httpResponse.Filter, CompressionMode.Compress); httpResponse.AddHeader("Content-encoding", "gzip"); } } else if (acceptEncoding.Contains("deflate")) { if (httpResponse.Headers["Content-encoding"] == null) { httpResponse.Filter = new DeflateStream(httpResponse.Filter, CompressionMode.Compress); httpResponse.AddHeader("Content-encoding", "deflate"); } } } } } } } }
<system.webServer>

