Web sayfalarımızın içeriği genişledikçe, sunucu tarafından oluşturulan cevapların(response) boyutu artmaktadır. Bu boyutu küçültmenin yolu içeriği sıkıştırmaktır.
Bu işlemi incelemek için senaryomuzda, içeriği binlerce kelimeden oluşan bir sunucu cevabı (response) oluşturup, kullanıcı(client) tarafına sunalım. Bu işlemi önce normal bir şekilde, ardından da sıkıştırılmış bir şekilde gerçekleştirelim ve farkı görelim.
ASP.NET MVC ortamında çalıştığımız için önce bir action metod oluşturup içeriğini doldurarak sunalım ve boyutuna bakalım.
public ActionResult Zip() { StringBuilder result = new StringBuilder(); for (int i = 0; i < 42000; i++) { result.Append("word"); } return Content(result.ToString()); }
Yukarıdaki action metod ile 42000 kelimeyi içeren bir içeriği kullanıcıya sunuyoruz. Bu içeriğin boyutuna Firefox tarayıcısında Firebug eklentisiyle bakalım.
Evet içerin 164.1KB boyutunda oluşturulmuş durumda.
Şimdi bu işlemi, içeriği sıkıştırarak yapmayı deneyelim. Önce sıkıştırılacak action metod veya controller sınıfını sıkıştırmaya yarayan bir attribute oluşturalım. Daha sonra sıkıştırmak istediğimiz metodu bu attribute ile imzalayabiliriz.
public class CompressAttribute: ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var encodingAccept = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; if (string.IsNullOrEmpty(encodingAccept)) return; encodingAccept = encodingAccept.ToLowerInvariant(); var response = filterContext.HttpContext.Response; if (encodingAccept.Contains("gzip")) { response.AddHeader("Content-encoding", "gzip"); response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); } else if (encodingAccept.Contains("deflate")) { response.AddHeader("Content-encoding", "deflate"); response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); } } }
Şimdi oluşturduğumuz bu attribute ile metodumuzu imzalayıp tekrar içerik boyutuna bakalım.
[Compress] public ActionResult Zip() { StringBuilder result = new StringBuilder(); for (int i = 0; i < 42000; i++) { result.Append("word"); } return Content(result.ToString()); }
İçerik 1.9KB boyutuna düştü. Sıkıştırma işleminden önceki içerik 164.1KB idi. Bence bu müthiş birşey.
Tekrar görüşmek ümidiyle…