Site dosyalarınızı sıkıştırmak Gzip & Deflate

gzip

Web sitelerinin daha hızlamasını açılmasını ve site trafiklerinin düşmesi herkes için önemlidir. Ayrıca arama motorları içinde robotların daha hızlı bir şekilde sitelerinizi indexleyebilmesi önemlidir.

Bir web sayfasını açmak üzere tarayıcınıza tıkladığınızda, arkada bir çok şey olur. Bunlardan biri de, isteğin hangi formatta olacağına
karar verilmesidir. Bir web sayfası açmaya çalıştığınızda tarayıcınız sizin için aşağıdakine benzer bir bilgi gönderir.Eğer dosyalarınızı sıkıştırırsanız bu size hem performans açısından hem de Seo açısından büyük kolaylık
sağlayacaktır.

Gönderdiğiniz bilgilerden Accept:
*/* ve Accept-Encoding: gzip,deflate satırlarına dikkatinizi çekmek istiyorum. Accept, istemcinin (yani tarayıcınızın) kabul ettiği MIME (Multipurpose Internet Mail Extensions) tiplerini, Accept-Encoding ise kabul ettiği kodlama biçimlerini gösterir.

Tarayıcınız sizin adınıza gzip ve deflate algoritmaları ile sıkıştırılmış verileri kabul ettiğini gönderiyor.

Gzip, özellikle metinlerde etkili bir algoritmadır. Aynı zamanda sıkıştırma/açma hızı yüksek bir algoritma olduğundan sıkça tercih edilir. Ben veritabanı yedeklerimi sunucumdan gzip ile sıkıştırılmış olarak çekiyorum. Bir veritabanından gelen metin tabanlı veriyi 4 te biri oranına kadar düşürebilmektedir.. Mesala benim 92 Kb’lık açılış büyüklüğüne sahip olan sayfamı 26 Kb’ a kadar küçülttü. Web’de CSS, HTML ve JavaScript dosyalarında bu kadar sık kullanışmasının nedeni de tam olarak bu performans.

Asp.Net için Yapılması Gerekenler

Global.asax
dosyamıza aşağıdaki değişiklikleri yapmamız gerekmektedir.

***************************************************************************************************************************************

<%@ Import Namespace=”System.IO” %> <%@ Import Namespace=”System.IO.Compression” %>
<script runat=”server”> void Application_PreRequestHandlerExecute(object sender, EventArgs e) {    HttpApplication app = sender as HttpApplication;   string acceptEncoding = app.Request.Headers[“Accept-Encoding”];    Stream prevUncompressedStream = app.Response.Filter;
if (!(app.Context.CurrentHandler is Page ||      app.Context.CurrentHandler.GetType().Name == “SyncSessionlessHandler”) ||       app.Request[“HTTP_X_MICROSOFTAJAX”] != null)       return;
if (acceptEncoding == null || acceptEncoding.Length == 0)       return;
acceptEncoding = acceptEncoding.ToLower();
if (acceptEncoding.Contains(“deflate”) || acceptEncoding == “*”)    {      // defalte       app.Response.Filter = new DeflateStream(prevUncompressedStream,         CompressionMode.Compress);      app.Response.AppendHeader(“Content-Encoding”, “deflate”);    } else if (acceptEncoding.Contains(“gzip”))    {       // gzip      app.Response.Filter = new GZipStream(prevUncompressedStream,         CompressionMode.Compress);      app.Response.AppendHeader(“Content-Encoding”, “gzip”);   } } </script>
***************************************************************************************************************************************
Şimdi Bunu açıklayalım.

Global.asax dosyamız içerisinde tüm işlemleri Application_PreRequestHandlerExecute methodu içersinde yürütüyoruz.

***************************************************************************************************************************************

void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{


}

***************************************************************************************************************************************
Bu metodumuzu oluşturan nesne yi HttpApplication türüne çevirmemiz gerekiyor. Kullanıcı tarayıcısındaki başlıkları bu sayede yakalayacağız. Biz Accept-Encoding başlığını aramaktayız. Tarayıcının Gzip / Deflate sıkıştırmasını destekleyip desteklemediğine burada bakıyoruz. Bunu prevUncompressedStream nesnesine çevirmemiz gerekiyor. Şimdi gelen asp.net kaynağından gelen değerin bir webservis mi yoksa bir asp.net sayfa mı olduğuna karar vermeye çalışıyoruz. HttpRequest koleksiyonunun elamanı olan “HTTP_X_MICROSOFTAJAX” ı arıyoruz. Bu
elaman çoğunlukla ajax – asp.net sayfalarında kullanılır. Burada kendimizi güvence altına alıyoruz. Asp.net içeriği sıkıştırıldığı zamanda eğer ajax o an kullanılıyorsa. Sayfa hata verecektir. Bunun için ajax ın aktif olmadığı anı bilebilmemiz gerekiyor.En sonunda “Accept-Encoding” başlığını kontrol edebileceğiz. Eğer burada boş bir değer alırsak bu bize tarayıcımızın bunu desteklemediği bilgisini verecek. acceptEncoding başlığı için deflate değerimizi aramaya başlayabiliriz artık.***************************************************************************************************************************************
if (acceptEncoding.Contains(“deflate”) || acceptEncoding == “*”)    {       // defalte       app.Response.Filter = new DeflateStream(prevUncompressedStream,         CompressionMode.Compress);      app.Response.AppendHeader(“Content-Encoding”, “deflate”);    } else if (acceptEncoding.Contains(“gzip”))    {       // gzip      app.Response.Filter = new GZipStream(prevUncompressedStream,         CompressionMode.Compress);      app.Response.AppendHeader(“Content-Encoding”, “gzip”);    }
***************************************************************************************************************************************DeflateStream nesnemizi tanımladık ve Response.Filter değerine atadık. Buradaki tüm sayfaya yazmalar için DeflateStream nesnesini çağırdık ve çıkışta sıkıştırma işlemini gerçekleyebildik.Eğer tarayıcı Deflate’i desteklemiyorsa Gzip ile yapacağız bu işlemi.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir