Son Haberler
Anasayfa / Yazılım / ASP.NET / Application State Kullanımı

Application State Kullanımı

Uygulamalarımızın tamamı içinde yer alan nesneleri, değişkenleri, özel olarak tanımladığımız her şeyi Application adı verilen nesne içinde saklayabiliriz. Bu nesne içinde saklanan her türlü dataya Application State adı verilir. Application State ayrıca uygulamalarımızda yer alan tüm sayfalar içinde bu nesne içindeki dataları paylaşma imkanı tanır.

Application state, session state ile oldukça benzerdir. Aralarındaki fark şudur, session state kullanıcının ziyareti süresince ilgili değişkenleri ve dataları saklar. Application state ise değişkenleri ve nesneleri aynı anda uygulamanın tüm kullanıcıları tarafından paylaşıma sunar. Böylelikle tüm kullanıcıların ortak olarak kullanmış olduğu bir uygulamada dataları saklamak için en ideal durum application state’tir.

ASP.NET’te session ve application state her ikiside koleksiyon şeklinde uygulanır ve name-value ayarlaması-uyarlaması yapar. Uygulamalarımızda kullanırken örnek olarak :

Application["SiteName"] = "İsmail GÜRSOY Blog";

Daha sonra bu SiteName değerini uygulamarımızda bir string değeri olarak okuyabiliriz.

string appName = (string)Application["SiteName"];

Üstteki kodda bir nesne olarak tanımlanan SiteName casting işlemi ile stringe çevrilerek string değişken olan appName değişkenine aktarılmıştır.

Application state’ten herhangi bir nesneyi kaldırabilmemizde mümkündür bunun için örnek olarak;

Application.Remove("SiteName");

Eğer application state içinde birden fazla nesne var ise bunları tek seferde kaldırmak için ise;

Application.RemoveAll();

Application içinde değişkenler kullanılırken dikkat edilmesi gerekir. Nesneler biz bunları kaldırana kadar yada IIS sonlandırılana kadar Application içinde kalırlar. Peki bunun ne gibi sorunu olabilir? Eğer Application state içinde nesnelerimi gerektiği anlarda kaldırmaz isem bir süre sonra uygulama performansım düşecek, yavaşlayacak ve server isteklere ağır bir şekilde cevap verecektir.

Application State için bir örnek yaparsak olayı daha net kavrayabiliriz. Application state özellikler hit saymak için oldukça başvurulan bir durum yönetimidir. Örneğimde de ilk olarak bunu ele alacağım. Şimdi bir örnek web site projesi açalım ve Default.aspx sayfasını düzenleyelim. Form elementi içine bir adet label kontrolü ekliyorum. İlgili kodlarım şu anda :

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>





    


    
Bu sayfa için defa istekte bulunulmuştur.

Şimdi design bölümünde bir adet label eklendiğini görebilirsiniz. Şimdi bu dosya için codebehind tarafında ilgili kodlarımızı yazalım ve sitemizin server üzerinden kaç defa fequest edildiğini saymaya çalışalım. Bu kodumuzu yazacağımız yordam Page_Load eventidir. Dolayısı ile sayfam üzerinde boş bir yere çift tıklayarak direkt olarak codebehind tarafında ilgili yordam altına gelebilirim.

Default.aspx.cs Dosyası :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Application["SayfaSayac"] != null && (int)Application["SayfaSayac"] >= 10)
        {
            Application.Remove("SayfaSayac");
        }

        if (Application["SayfaSayac"] == null)
        {
            Application["SayfaSayac"] = 1;
        }

        else
        {
            Application["SayfaSayac"] = (int)Application["SayfaSayac"] + 1;
        }

        myLabel.Text = Convert.ToString(Application["SayfaSayac"]);
    }
}

Uygulamamız çalıştırıldığında ilk anda çalıştığı için serverdan istek geldiğinden dolayı sayaçta 1 olacak. Daha sonra sayfayı her yenilediğimde sayaç bir artarak saymaya devam edecek. Ben kod bloğumda sayfa sayaç değeri için 10 üzerine ulaştığında application nesnemi boşalltığımdan dolayı tekrar sayfam request edildiğinde 1 den itibaren saymaya başlayacak.

Eğer uygulamamı ben direkt olarak tarayıcı sekmesinden kapatarak yaparsam, Application state içindeki datayı hatırlayacağından dolayı sayfayı tekrar açtığımda en son data ile açılır. Örneğin sayfada 7 defa istekte bulundum diyelim, undebug değil de direkt olarak sayfayı kapattım ve sonra tekrar açtım diyelim. Sayaç bu sefer 7 bilgisi ile tarayıcımda görünür.

Kodlarımda da görüldüğü üzere Application State içindeki data nesne tipinde olduğu için ben bunu sayaçta kullanmak istediğimde int tipinde bir veriye casting işlemi yapıyorum. Aksi halde kodlarım çalışmaz. Daha sonra SayfaSayac değerimi arttırıyorum. (Her istekte) Uygulamam ilk açıldığı, ilk çalıştırıldığı anda Application State eğer boşsa yani null ise SayfaSayac değerim 1 olarak açılıyor.

Buraya kadar her şey gayet iyi güzel. Peki tamam da, peki ya aynı anda benim sitemi iki kullanıcı açarsa ne olacak? Benim kodlarıma göre sadece birini baz alarak artış olacak.

Şimdi kod bloğumda, şunu demiştim :

...
Application["SayfaSayac"] = (int)Application["SayfaSayac"] + 1;
...

= operatörünün sağ tarafı ilk olarak değerlendirilir. Bunu yapmak için, server uygulama içindeki SayfaSayac değerini okumalıdır. Öncelikle bu değere bir ekleniyor ve daha sonra bu elde edilen son değer güncellenmiş hali ile SayfaSayac’ta tutuluyor.

Şimdi az önce belirttiğim durumu hayal edelim, aynı anda iki tane kullanıcı sayfamızı ziyaret etmiş olsun. Web server ilk kullanıcının isteklerini dikkate alır, diğeri dikkate alınmaz. İlk kullanıcı için yüklenen sayfanın güncellenme durumuna bağlı olarak, application state’ten SayfaSayac değeri okunur, örneğin kullanıcı 5 defa sayfayı yeniler, altıncı yenilemede SayfaSayac değeri 1 arttırılır. Bu durumu resmederek anlatırsak :

İşte bu karışıklıktan sakınabilmek için bir kullanıcı application state içinde ilgili nesneyi kullanırken kilitleme yapmaktır, bunu resmedersek ;

Şimdi bu duruma göre kodlarımı düzenlersem :

Default.aspx.cs dosyası :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Application["SayfaSayac"] != null && (int)Application["SayfaSayac"] >= 10)
        {
            Application.Remove("SayfaSayac");
        }

        if (Application["SayfaSayac"] == null)
        {
            Application["SayfaSayac"] = 1;
        }

        else
        {
            Application.Lock(); //Application kilitleniyor.
            Application["SayfaSayac"] = (int)Application["SayfaSayac"] + 1;
            Application.UnLock(); //Unlock ediliyor.
        }

        myLabel.Text = Convert.ToString(Application["SayfaSayac"]);
    }
}

Böylelikle ancak tek bir kullanıcı herhangi bir zamanda application nesnesini kullanabilir.

{filelink=22}

2 yorum

  1. çok açıklayıcı bir paylaşım olmuş teşekkürler

  2. Helal olsun. lafı dolandırmadan adam gibi açıklama yapmışsın kardeşim klavyene eline emeğine sağlık.

Bir cevap yazın

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