ASP.NET ViewState Içerigini Sikistirmak

ViewState verileri sayfa içerisinde Hidden fieldlerde tutmamiza olanak saglayan bir yapidir. ViewState içerisinde tutulan bilgiler sunucudan istemciye gönderilir ve ayni yolla yeniden sunucuya yüklenir. ViewStateler içerisindeki veriler Sessionlardan farkli olarak sunucuda saklanmazlar.  Her seferinde istemciye gönderilerek ag trafigini arttirdiklari gibi sayfa boyutlarini da büyütürler. ViewState içerisindeki bilgiler güvenlik sebebi ile sifrelenerek saklanir. Bir web sayfasi açip, sayfayi sag tikladiktan sonra kaynagi görüntüler derseniz sayfa içerisinde bulunan sifrelenmis ViewState verisini görebilirsiniz.

.

ViewState hakkinda daha fazla bilgi için daha önce yayinladigim State Management ve View State isimli makaleye göz atmanizi tavsiye ederim.

Sayfa içerisindeki ViewState asagidaki gibidir.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="hW0f8wh7e+CFHZeGS3F2wM/sLI0kd/u/LN9HyCbtEcqlTf1hpGuxs8Ii8WY5fHtv4AGWCqnLbfHC/J8q
0W592ll2+N+uGJTB4+/9eNBWBnJfaPJeUY1LgexBQ3jrWHYaMN/29VLnTExTCksHUzuKd57kVM4Cf3aajR4
CldwfkTCuUXiJufnsCq0YRFsn/R8t2Bb2fj/WDL6vXhFL7oXIgZgVDQ5btz/RmW9xVQo52enK0RfgKzB55EDnL
+JbDH725M4zBikQIbd00IgUdmCsaECn+xlD1s683NWYoAyx1hqkrR0445onKJf4YlmTtTXF5mINvdOleSxyy
EIR8IJf6hKY53oDfxMBlXDpof24FhmZPMazcKU8AsK4ZV8N6rVH3Uez+FAd+qZDdM9dMtRx7fliGigYHwjYV6
wGVlp6pC0PdIKe9o6W87FEoFumA317hBB3Ym50FbqmpKMUzFa2FVM1mWkB1oIfovB/r/k+VTvym8249B6
7dxJNFW8pPcyFzVXKVXWYQDHFDa6mXuAHE+69zkIpYIUmAKZFaQJuIhLbA0S0CssdxCGk4MKCCZzDZFU
sOroc5lMG/e6RDFFuRUMRL977NVnE90B6lnVSauQIRFb7ZWfnOu/xwjkWe7dkJMF7lyH26ljCyIeUrhel9J7rt+i
yCrUP062Olz+XScXfdsuM3QbMIjCeFSbv6UlbUgZJrhUvMVAezS2lmD2BvYbZTYFdUB8vw5Oc0axFK3Q2kH
GSYUTILiwKOSSGC1NkIwAcnUo94EdgFuMFPUYhHawD6XGIlR5iCznarmhU3UbjtUcaMm9S3HRiRrWFixjEBd
1zwwqcaDBIr24Lfe5eOuNvAtl9UFndgOwoYtDvp8TTfuZ4cxU961c9pcQXhwIZ424ir7BJV+P5OPq6xS/xgCRW
/pXa6fXAUvGxglxydPyByB5ou1QKKnMkfFeKxvcvOgSaCTQOW9RugNo3HV4Z5GrHcCdABr9/71JaOtvgan142
uEh6r6pAbTwhf71aA8fu0DGvMAdZ2cgibxL4WhKSRWV2jiUjlkrurWMU+vxaOwTwva60PkaLPkJJvBkyN6xH0Bs
JW7ymEzSbdFS+yHzX3gdqj4BcZ3SlnY2zKAk9Sn9FW3JZRfCvVmoxwXgyErs4UVDEJXKdZjjQcLE5hu/yDkOsT
CydkgRBEq1YkSIBKKKK3r3YzHiU7hypue+pYFCjocYPE4u9zUEsrC8SU8j1FGwLXoabxQZGvoVVe0Hu6/qPYG
SbCkokGly8r2ikieyOeChKSoOGkNdBgEF2jY5YNojJBurrWQx9u6Yl9n8cxhCNjjZsnBACz7SDShai0I+APUgpU8
FUcKDVipj2g8/QvDeyYB9Od9c9SqRlBiTUuoBQG09/eK9b8kN9OgWDiKYTxR9jDx6+VEO2SYCLprVyvT4do4t……

Yukarida bir parçasini gördügünüz ViewState verisi sayfa her postback oldugunda sunucuya gider. Sunucu bu veriyi çözümleyerek gerekli bilgileri aldiktan sonra güncelleyerek yeniden sayfaya içerisine yerlestirir ve istemciye gönderir. Sayfa boyutunu büyütmesi ve sunucu trafigini arttirmasi viewstatelerin dezavantajlarindan sayilabilir. Simdi gelelim bu dezavantaji nasil bir nebze giderebilecegimize.

.

ViewState verisini Sikistirmak

ViewStateler üzerinde web browser herhangi bir islem yapmazlar. ViewStateler içerisindeki bilgileri sunucu kullanmaktadir. Öyleyse ViewState olusturulurken bu bilgiyi sikistirarak sayfaya yerlestirirsek bir nebze boyuttan kazanmis oluruz. Sunucu ViewState den okuma yapacagi zamanda sikismis veriyi yeniden açarak üzerinde islem yapabiliriz. Simdi gelelim bunu nasil yapabilecegimize.

Web projemize Mengene adinda bir class ekleyelim ve bu classi App_Code içerisine yerlestirelim. Mengene classi içerisine asagidaki kodu ekleyelim.

public static class Mengene {

 

  public static byte[] Compress(byte[] veri)

  {

    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output,CompressionMode.Compress, true);

    gzip.Write(veri, 0, veri.Length);

    gzip.Close();

    return output.ToArray();

  }

 

  public static byte[] Decompress(byte[] veri) {

    MemoryStream input = new MemoryStream();

    input.Write(veri, 0, veri.Length);

    input.Position = 0;

    GZipStream gzip = new GZipStream(input,CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buffer = new byte[64];

    int read = -1;

    read = gzip.Read(buffer, 0, buffer.Length);

    while(read > 0) {

      output.Write(buffer, 0, read);

      read = gzip.Read(buffer, 0, buffer.Length);

    }

    gzip.Close();

    return output.ToArray();

  }

}

         Yukaridaki kodu inceleyecek olursak Compress fonksiyonu Framework ile gelen GZip nesnesini kullanarak gönderdigimiz veriyi sikistirir. Decompress ise ayni islemin tersini yapar. Simdi gelelim bu islemi sayfamizda nasil kullanacagimiza.

         Sikistirma yapmak istedigimiz sayfaya ait kod kismina gelelim ve asagidaki kodu yazalim. Asagidaki islemi Masterpage içerisinde yapacak olursaniz SavePageStateToPersistenceMedium, LoadPageStateFromPersistenceMedium metotlari için hata alacaksiniz. Bu yüzden masterpage içerisinde degil sayfanin kendine ait kod kisminda uygulamaniz gerekiyor.

protected override void

    SavePageStateToPersistenceMedium(object viewState)

{

    LosFormatter _formatter = new LosFormatter();

    MemoryStream ms = new MemoryStream();

    _formatter.Serialize(ms, viewState);

    byte[] viewStateArray = ms.ToArray();

    ClientScriptManager clientScript = Page.ClientScript;

    clientScript.RegisterHiddenField("__COMPRESSEDVIEWSTATE",

        Convert.ToBase64String(

        Mengene.Compress(viewStateArray)));

}

protected override object

    LoadPageStateFromPersistenceMedium()

{

    LosFormatter _formatter = new LosFormatter();

    string vsString = Request.Form["__COMPRESSEDVIEWSTATE"];

    byte[] bytes = Convert.FromBase64String(vsString);

    bytes = Mengene.Decompress(bytes);

    return _formatter.Deserialize(

        Convert.ToBase64String(bytes));

}

 .

         Gördügünüz gibi tek yaptigimiz ASP.NET sayfalarina ait iki metotu override etmek ve içerisinden daha önce yazdigimiz Mengene sinifina ait metotlari çagirmak. Hepsi bu kadar. Simdi sayfalariniza ait boyutlara bakacak olursaniz % 10 ile % 50 arasi bir küçülme fark edeceksiniz. Ben yazilim mutfagina ekledim ve ana sayfada %10’luk bir küçülme saglarken Makale okuma sayfasinda % 45’lik bir kazanç sagladim. Hiç de küçümsenecek bir kazanç degil. Helede hosting firmalarina daha fazla trafik için fazladan para ödemek istemiyorsaniz. Peki yaptigimiz bu islemin maliyeti ne? Verileri sikistirmak sayfa boyutunu küçültü dolayisiyla ag trafigimizde o nebze azalmis oldu. Bu sikistirma islemi sirasinda sunucumuzun islemcisine biraz is düsüyor. E bunu da artik hosting firmamiz düsünsün J.

4 thoughts on “ASP.NET ViewState Içerigini Sikistirmak

  1. Merhabalar; 

    dediginiz islemi yaptim ama uye ol sifremi unuttum vb. gibi sayfalarda post oldugunda hata aliyorum, Convert.ToBase64String(bytes)); kodunda..
    Deneyen veya cozum bulan var mi?
  2. Iyide arkadas artik hosting firmalari su kadar ram kullaniyorsunuz sukadar cpu kullaniyorsunuz diye uyarilarda bulunuyor. Makale güzel açiklayicida ama böyle bir sorunda var..

Guests için bir cevap yazın Cevabı iptal et

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