Una delle cose che spesso si dimentica quando si progetta un'applicazione web è che esistono ancora molti utenti che navigano con modem tradizionali e quindi la dimensione della pagina impatta molto sulle prestazioni. Con poche righe di codice è possibile implementare un handler che comprime la pagina con gzip o deflate in caso che il browser dell'utente supporti questo formato. L'handler è primitivo e mostra in generale come sia possibile effettuare una compressione semplicemente aggiungendo un filtro alla response.
namespace MyWebHandlers {
public class CompressorModule : IHttpModule {
#region IHttpModule Members
public void Dispose() {
}
public void Init(HttpApplication context) {
context.PreRequestHandlerExecute += PreRequestHandlerExecute;
}
private Boolean RequestCanBeZipped(String page) {
return page.EndsWith(".aspx");
}
private void PreRequestHandlerExecute(
object Sender, EventArgs e) {
if (RequestCanBeZipped(HttpContext.Current.Request.FilePath))
CompressRequest();
}
private void CompressRequest() {
if (HttpContext.Current.Request.Headers["Accept-encoding"] != null &&
HttpContext.Current.Request.Headers["Accept-encoding"].Contains("gzip")) {
GZipStream gzip = new GZipStream(HttpContext.Current.Response.Filter, CompressionMode.Compress, true);
HttpContext.Current.Response.Filter = gzip;
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
}
else if (HttpContext.Current.Request.Headers["Accept-encoding"] != null &&
HttpContext.Current.Request.Headers["Accept-encoding"].Contains("deflate")) {
DeflateStream defl = new DeflateStream(HttpContext.Current.Response.Filter, CompressionMode.Compress, true);
HttpContext.Current.Response.Filter = defl;
HttpContext.Current.Response.AppendHeader("Content-encoding", "deflate");
}
}
#endregion
}
}