21 Haziran 2018 Perşembe
Twitter

Asp.Net sayfalarımızı sıkıştıralım..

Sayfalarımızı hızlandırmanın bir yolu olarak html çıktısını ve viewstate'i sıkıştırabiliriz.

Sayfalarımızı cache leme önemli bir konudur. Aşağıdaki şekilde kolayca sayfalarımızı cacheleyebiliyoruz.

 <%@ OutputCache Duration="86400" VaryByParam="Id" %>

URL'den gelen Id parametresine göre sayfamızı kolayca cacheledik. İsteyenler Google'dan "State Management" konusunu da ayrıca araştırabilirler.,

Bu yazının konusu cacheleme gibi sayfalarımızın hızını arttıracak diğer konuları işlemek.

Önce serverdan tarayıcımıza gönderilecek html outputu sıkıştıracağız sonra da sayfamızın viewstate bilgisini.


1) Gzip / Deflate ile sayfalarımızı sıkıştırma

Önce kendinize şu soruyu sormalısınız, sayfamın hızlı açılmasını mı yoksa servera fazladan yük bindirmemeyi mi tercih ederim?

Eğer, servera yük binerse binsin, ben sayfalarımın hızlı açılmasını isterim diyorsanız yazıyı okumaya devam edin.

Aşağıdaki şekilde bir metotla sayfalarımızı sıkıştırabiliriz:

bool isZipSupported = true;

public void ZipEncodePage()
{
    if (isZipSupported)
    {
        HttpResponse response = HttpContext.Current.Response;
        string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
        if (AcceptEncoding.Contains("gzip"))
        {
            response.Filter = new System.IO.Compression.GZipStream(
                            response.Filter, System.IO.Compression.CompressionMode.Compress);
            response.AppendHeader("Content-Encoding", "gzip");
        }
        else if (AcceptEncoding.Contains("deflate"))
        {
            response.Filter = new System.IO.Compression.DeflateStream(
                                response.Filter, System.IO.Compression.CompressionMode.Compress);
            response.AppendHeader("Content-Encoding", "deflate");
        }
    }
}

isZipSupported değerini true yaptığınız sayfalarınızda bu metodu çağırdığınızda html outputu sıkıştırılacaktır. Özellikle metin ağırlıklı sayfalarınızda bu metodu kullanmanızı tavsiye ediyorum.

Daha güzel bir yol olarak da bu metodu  System.Web.UI.Page sınıfından türeyen bir üst sınıfa yerleştirerek sıkıştırılmasını istediğimiz sınıfları bu sınıftan türetmek ve sonra da bu metodu çağırmak.

--------- *** ----------

İsterseniz daha kolay bir yöntem olarak web.config içerisinden bu işlemin otomatik olarak yapılmasını da sağlayabilirsiniz:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9"/>
  <dynamicTypes>
    <add mimeType="text/*" enabled="true"/>
    <add mimeType="message/*" enabled="true"/>
    <add mimeType="application/javascript" enabled="true"/>
    <add mimeType="application/x-javascript" enabled="true"/>
    <add mimeType="*/*" enabled="false"/>
  </dynamicTypes>
  <staticTypes>
    <add mimeType="text/*" enabled="true"/>
    <add mimeType="message/*" enabled="true"/>
    <add mimeType="application/javascript" enabled="true"/>
    <add mimeType="application/x-javascript" enabled="true"/>
    <add mimeType="*/*" enabled="false"/>
  </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true"/>

Bu kodu <system.webServer>...</system.webServer> tagları arasına ekleyin, olsun bitsin. :)

Detaylardan bahsetmeye fazla gerek yok sanırım. İsteyenler http://dalt.in/Nz46T adresinden daha detaylı araştırabilirler.


2) Viewstate'i sıkıştırma

Viewstate'i sıkıştırmak için de sayfalarımızı şu sınıftan türetebiliriz:

public class MyViewstateZippedPage : System.Web.UI.Page
{
    private bool zipli = false;

    protected bool ViewstateZip
    {
        get { return zipli; }
        set { zipli = value; }
    }

    protected override void SavePageStateToPersistenceMedium(object state)
    {
        if (!zipli)
        {
            base.SavePageStateToPersistenceMedium(state);
            return;
        }
        LosFormatter formatter = new LosFormatter();
        StringWriter writer = new StringWriter();
        formatter.Serialize(writer, state);
        string viewState = writer.ToString();
        byte[] data = Convert.FromBase64String(viewState);
        byte[] compressedData = ViewstateZipProcessor.Compress(data);
        string str = Convert.ToBase64String(compressedData);
        //ClientScript.RegisterHiddenField("__CompressedVIEWSTATE", str);
        ScriptManager.RegisterHiddenField(this, "__CompressedVIEWSTATE", str);
    }

    protected override object LoadPageStateFromPersistenceMedium()
    {
        if (!zipli)
        {
            return base.LoadPageStateFromPersistenceMedium();
        }
        string viewstate = Request.Form["__CompressedVIEWSTATE"];
        byte[] data = Convert.FromBase64String(viewstate);
        byte[] uncompressedData = ViewstateZipProcessor.Decompress(data);
        string str = Convert.ToBase64String(uncompressedData);
        LosFormatter formatter = new LosFormatter();
        return formatter.Deserialize(str);
    }

}

Böylece Viewstate'inin sıkıştırılmasını istediğimiz sayfalarımızı şu şekilde yapılandırabiliriz:

public partial class Default2 : MyViewstateZippedPage
{
    public Default2()
    {
        base.ViewstateZip = true;
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

Sayfamızın constructor'ı içerisinden viewstate'imizin sıkıştırılıp sıkıştırılmayacağına karar veriyoruz. :)

Ya da isterseniz üst sınıftaki

private bool zipli = false; 

satırını 

private bool zipli = true;

olarak değiştirirsiniz işiniz rahatlar. Geriye kalan olay, sayfalarınızı MyViewstateZippedPage sınıfından türetmek :)

Viewstate'leri ziplediğimiz sayfaların kaynağını görütülediğinizde, ASP.NET'in standart olarak oluşturulan 

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

bilgisinin yanında bir de

<input type="hidden" name="__CompressedVIEWSTATE" id="__CompressedVIEWSTATE" value="....." />

bilgisinin oluşturulduğunu göreceksiniz.

Etkili bir yöntem.. :)

Ben bu yöntemi kullandığımda bazı sayfalarda %30'a yakın sıkıştırma oranı elde ettim. Son derece güzel bir oran.

Bu işin bir başka güzelliği de server trafiğini azaltmak oldu. Aylık trafik toplamların inceleyin, değişimi farkedeceksiniz.

Ayrıca, olaya bir de SEO açısından bakacak olursak; bütün arama motorları, hızlı açılan ve sıkıştırma özelliği kullanılan sitelere daha güzel bir gözle bakarlar.  Bkz. http://dalt.in/Yg43F

Herkese iyi çalışmalar...

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 4,10 (2 oy)
Yazıdaki kodların kalitesi Puan: 5,00 (1 oy)
İhtiyaca cevap verme Puan: 2,73 (2 oy)
Tavsiye edilebilirlik Puan: 3,45 (1 oy)
Genel değerlendirme Puan: 3,80 (2 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumları
  • Facebook Yorumları Facebook Yorumları
Yeni yorum yaz Toplam: 10, Onay bekleyen: 0.
  1. Necmettin Yanık

    Güzel yazı için teşekkürler hocam. Fakat web sitesinin sayfanın kaynağnı görüntüle kısmında oluşan boşluklu yazıları daha nizami bir görüntü vermek için ne yapabiliriz?

  2. çağatay cnegiz

    hocam merhaba..tarif ettiğiniz gibi <system.webServer> <httpCompression directory=`%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files`> <scheme name=`gzip` dll=`%Windir%\system32\inetsrv\gzip.dll` staticCompressionLevel=`9`/> <dynamicTypes> <add mimeType=`text/*` enabled=`true`/> <add mimeType=`message/*` enabled=`true`/> <add mimeType=`application/javascr_ipt` enabled=`true`/> <add mimeType=`application/x-javascr_ipt` enabled=`true`/> <add mimeType=`*/*` enabled=`false`/> </dynamicTypes> <staticTypes> <add mimeType=`text/*` enabled=`true`/> <add mimeType=`message/*` enabled=`true`/> <add mimeType=`application/javascr_ipt` enabled=`true`/> <add mimeType=`application/x-javascr_ipt` enabled=`true`/> <add mimeType=`*/*` enabled=`false`/> </staticTypes> </httpCompression> <urlCompression doStaticCompression=`true` doDynamicCompression=`true` dynamicCompressionBeforeCache=`true`/> </system.webServer> şeklinde yaptım ama hem pagespeedinsights`ta hem de http://checkgzipcompression.com sitesinde gzip aktif değil diyor...ne yapmam gerekir??yardımcı olursanız sevinirim..

  3. Ali ÖZCAN

    Teşekkürler :)

  4. Devrim Altınkurt

    https://www.dropbox.com/s/xgkfwlrl0kuvtlw/ViewstateZipProcessor.cs?dl=0 adresinden indirebilirsiniz. Yazıya eklemeyi unutmuşum. :)

  5. Ali ÖZCAN

    byte[] compressedData = ViewstateZipProcessor.Compress(data); ve byte[] uncompressedData = ViewstateZipProcessor.Decompress(data); satırlarında hata veriyor. `The name `ViewstateZipProcessor` does not exist in the current context` diye. Nasıl çözebilirim...