Makale Özeti

ASP.NET web uygulamalarında kullanıcıya ait bilgilerin tutulduğu önemli nesnelerden birisi de Session nesnesidir. Bir örnekle bu nesnenin web servislerinde nasıl etkin hale getirileceğini ve kullanılacağını göstereceğiz.

Makale

Web Servislerinde Session Durum Nesnesinin Kullanılması

 

Alper ÖZEL

Bilge Adam

 

12 Kasım 2005

 

Makale Özet :

ASP.NET web uygulamalarında kullanıcıya ait bilgilerin tutulduğu önemli nesnelerden birisi de Session nesnesidir. Bir örnekle bu nesnenin web servislerinde nasıl etkin hale getirileceğini ve kullanılacağını göstereceğiz.

Makale İçeriği :

Session Nesnesi Nedir

Herhangi bir kullanıcı Sunucu tarafına ilk istekte bulunduğunda Sunucu bu kullanıcı için bir SessionID üretir ve kullanıcıya cevapla beraber SessionID’yi içeren bir HttpCookie gönderir. Kullanıcı ve Sunucu arasında gerçekleşen daha sonraki iletişimde Sunucu bu Cookie’yi kullanarak kullanıcının takibini yapar. ASP.NET eğer Session durum yönetimi etkinleştirilmişse her yeni yaratılan SessionID ile ilişkili bir HttpSessionState nesnesi oluşturur ve bu nesne kullanıcıya ait bilgilerin tutulması için kullanılır.

 

ASP.NET üzerinde temel olarak Session nesnesinin kullanımı etkin bırakılmıştır. Yalnız istenildiği durumda Session kullanımı devre dışı bırakılabilir.

 

Session nesnesi kullanımı web servislerinde temel olarak devre dışı bırakılmıştır. Çünkü web servislerinin temelindeki amaç, kullanıcı tarafından belirli bir metoda web üzerinden erişilmesi ve işin gerçekleştirimidir. Burada kullanıcının herhangi bir bilgisinin uygulama üzerinde tutulmayacağı öngörülür.

 

Eğer Session nesnesini bir web metod için etkinleştirmek istiyorsak çeşitli tanımlamalar yapmak durumunda kalırız. Şimdi bir uygulama örneği üzerinde kullanımın nasıl gerçekleşeceğini görelim.

Temel Uygulamaların Gerçekleştirimi

Öncelikle web servisimizi yaratarak işe başlayalım.

 

Bir web servisi projesi açalım. Servis içerisindeki bir metodda Session nesnesinin kullanımını etkinleştirmek için aşağıdaki gibi EnableSession özelliğini etkinleştirmemiz gerekir.

 

[WebMethod(EnableSession=true)]

public void setSessionValue(string deger)

{

Session["deger"] = deger;

}

 

Bu metod gönderilen bir değerin Session içerisinde tutulmasını sağlayacaktır. Şimdi set edilen değeri geriye döndürmek için bir get metodu yazalım.

 

[WebMethod(EnableSession = true)]

public string getSessionValue()

{

if(Session["deger"]!=null)

return Session["deger"].ToString();

else

return "";

}

 

Yazdığımız Servisi Html help sayfasıyla açarak test edelim. Bu iş için servisiniz üzerinde sağ tıklayıp “View in Browser” demeniz yeterlidir.

 

Açılan sayfada setSessionValue metodu linkine tıklayalım ve bir değer yazıp Invoke tuşuna basarak Session nesnesini set edelim.

 

Şekil 1: SetSessionValue

 

Daha sonra metodlar sayfasına geri dönüp getSessionValue metodunu çağıralım. Geri dönen değer aşağıdaki gibi olacaktır.

 

Şekil 2: GetSessionValue

 

Görüldüğü gibi sunucu tarafında kullanıcı için bir Session nesnesi yaratılmış ve değer set edilmiş.

 

Şimdi bir Windows uygulaması geliştirerek aynı servisi bu uygulamadan kullanalım.

 

Hemen ilk açılan formun üzerine iki Button ve bir TextBox sürükleyip bıraktım. TextBox set edilecek bilginin girişi için kullanılacak.

 

Şekil 3: Form1 Dizayn

 

Web Servisini kullanabilmek için projeye sağ tıklayıp “Add Web Reference” dedim ve servisin proxy sınıfını oluşturdum.

 

Form1 üzerinde Set Value tuşuna basıldığında, oluşturmuş olduğum proxy nesnesinin referansıyla servise ulaşarak setSessionValue metodunu çağırdım ve Session nesnesini set ettim. Aynı şekilde, GetValue tuşuna basıldığında getSessionValue metodunu kullanarak MessageBox üzerinde Session nesnesindeki değeri gösterdim.

 

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

 

private localhost.Service prx = new localhost.Service();

 

private void button1_Click(object sender, EventArgs e)

{

prx.setSessionValue(this.textBox1.Text);

}

 

private void button2_Click(object sender, EventArgs e)

{

MessageBox.Show(prx.getSessionValue(), "Get Session Value");

}

}

 

Yalnız uygulamayı çalıştırdığımızda, Sunucu üzerindeki Session değerini set etmemize rağmen sürekli olarak “getSessionValue()“ metodundan boş string’in döndüğünü gördük.

 

Şekil 4: Çalışma Zamanı

 

Bunun nedeni yaratılan proxy nesnesinin gönderilen Session Cookie’sini kaydedememesidir. Dolayısıyla web servisine olan her çağırımda SessionID ve ilgili Cookie tekrardan yaratılarak kullanıcı tarafına gönderilmekte, bu yüzden de yaratılan Session değerlerine ulaşılınamamaktadır.

 

Bu durumu çözmek için yaratılan proxy nesnesine bir CookieContainer nesnesi eklememiz gerekiyor. Bu sayede proxy nesnesi, gönderilen Cookie’leri tutabilir ve her çağırımda bu Cookie’yi kullanarak web servisi üzerinde kendisine ait olan Session nesnesine ulaşabilir. Her CookieContainer bir Session’ı yönetir. Yani farklı CookieContainer’ları kullanarak yaratılan proxy nesnesinden birden fazla Session’ı idare edebilmeniz olasıdır.

 

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

 

private localhost.Service prx = new localhost.Service();

private System.Net.CookieContainer ck;

 

private void button1_Click(object sender, EventArgs e)

{

if (ck == null)

{

ck = new System.Net.CookieContainer();

prx.CookieContainer = ck;

}

 

prx.setSessionValue(this.textBox1.Text);

}

 

private void button2_Click(object sender, EventArgs e)

{

MessageBox.Show(prx.getSessionValue(), "Get Session Value");

}

}

 

Sonuç olarak, programı tekrar çalıştırdığımızda artık set etmiş olduğumuz Session nesnesine ulaşabildik ve değeri alabildik.

 

Şekil 5: Çalışma Zamanı

Sonuç :

Bu makalede Session nesnesinin Web Servisleri içerisinde nasıl kullanılacağını ve bir Windows uygulamasından nasıl çağırılabilineceğini gördük. Peki neden tanımlanan proxy sınıfı içerisinde default olarak bir CookieContainer eklenmemiş? Bunun nedeni esnekliğin programcıya bırakılmış olmasıdır. Farklı CookieContainer nesnelerini yarattığınız proxy nesnesine atayarak, aynı anda web servisi üzerinde birden fazla Session’ı kontrol etme imkanına kavuşursunuz.