Asp.Net MVC Gzip/Deflate Sıkıştırılmış (Compressed) içerik

15 May

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.

Sıkıştırılmamış içerik

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

Gzip sıkıştırılmış içerik

İç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…

2 Replies to “Asp.Net MVC Gzip/Deflate Sıkıştırılmış (Compressed) içerik

  1. Hocam normal asp.net webform olayında nasıl oluyor acaba bu sıkıştırma işlemi?

  2. Asp.net MVC ortamında gelen Request Controller tarafında yakalanabildiği için, Controller içerisindeki Action metoda gelen request cevap olarak içeriği yukarıdaki gibi sıkıştırıp gönderebiliyor. Ancak Web Forms tarafında bu işlemi sanırım Application_PreRequestHandlerExecute içerisinde yapman gerekecek. Yani yukardaki örnekte OnActionExecuting içerisindeki işlem Web forms tarafında Application_PreRequestHandlerExecute içerisinde yapılacak. Tabi bu arada Web Forms tarafında çok fazla uygulama yapmadım desem yalan olmaz 🙁

Comments are closed.