"Session"lar kaybolmasın!

Bize gelen problemler arasında en çok rastladığımız tanımlardan biri "session'ların kaybolması"dır: "Gün içerisinde kullanıcılar durup dururken şifre giriş sayfasına yönlendiriliyor ve yeniden kullanıcı adı/şifre girmek zorunda kalıyorlar. "

"Session"ın ne olduğundan ve nasıl kullanılması gerektiğinden burada bahsetmeyeceğim. Bu yazının amacı gereği tek söylenmesi gereken şey, "session"ların bir ASP.NET uygulamasında nerede tutulabileceğidir:

  1. InProc: Bu ön tanımlı değerdir ve bilginin uygulama içerisinde tutulduğu durumdur.
  2. StateServer: Web uygulamamızın üzerinde çalıştığının dışında, ayrı bir uygulama çalışır ve bilgiler onun üzerinde tutulur.
  3. SQLServer: Adından da anlaşılacağı üzere, bilgiler SQL Server üzerindeki bir veritabanında tutulur.

Bu üç yöntemin de avantajları ve dezavantajları bulunmaktadır. Bunlar arasında elbette en hızlı olan InProc olacaktır. Çünkü direkt olarak uygulamayla session bilgileri aynı "process" içerisinde yer alır. StateServer, eğer uygulamayla aynı makine üzerinde çalıştırılırsa, neredeyse InProc kadar performanslı olacaktır. Fakat SQLServer'da, veriler ağ üzerinden gidip geleceği için bir miktar performans kaybı olacaktır.

Birden fazla sunucunun bulunduğu ortamlarda (NLB - load balancing) tüm web sunucuları ortak bir "session" tablosu kullanabilmesi, ve dolayısıyla kullanıcıların bir sunucudan diğerine "session"larını kaybetmemesi için en güvenilir yöntem, elbette SQLServer olacaktır.

NEDEN:

Şimdi gelelim asıl konumuz olan "session"ların kaybolmasına... "Session" bilgilerimiz, çok istisnai senaryolar dışında, sadece InProc veya StateServer'da tutuluyorsa kaybolabilir. Çünkü bu iki durumda, "session"lar hafızada (RAM) duruyordur, diskte değil. Dolayısıyla, bir nedenle makine yeniden başlayacak olursa, veya "process" kapanacak olursa, o uygulama üzerindeki "session" biligilerimiz kaybolmuş olacaktır.

"Session" bilgilerini InProc tuttuğumuz durumlarda bir olasılık daha var: Uygulamayı taşıyan IIS "process"i kapanmadan, sadece ASP.NET uygulaması yeniden başlatılabilmektedir. Örneğin, web.config dosyası üzerinde bir değişiklik yapıp kaydettiğinizde, uygulamanın üzerinde çalıştığı "aspnet_wp.exe" veya "w3wp.exe" kapanmadan uygulama yeniden başlayacaktır. Bu durumda da "session"lar kaybolacaktır.

ÇÖZÜM:

"Session"larımız bizim için, daha doğru bir deyişle uygulamamız için, çok önemliyse; veya birden çok sunucumuz varsa; veya IIS "web gardening" özelliğinden yararlanmak istiyorsak, en güvenilir çözüm "session"ı SQL Server'da tutmak olacaktır. Böylece, değil uygulama, sunucunun kendisi bile yeniden başlatılsa "session"larımız kaybolmamış olacaktır.

Eğer bunu yapamıyorsak, veya tercih etmiyorsak, o zaman uygulamamızın yeniden başlatılma zamanlarını düzenlememiz gerekecektir. Bunun için:

  1. IIS 6.0'daki uygulama havuzlarının (application pool) yeniden başlama ayarlarını düzenleyin. Configure Application Pool Recycling (IIS 6.0)
  2. Kullanımın yoğun olduğu zamanlarda sunucu üzerindeki web.config dosyasında ve "bin" klasöründe değişiklik yapmayın. Bunlar "process"in değil ama uygulamanın yeniden başlatılmasını tetikleyecektir. Bazı antivirüs veya yedekleme programları da buna neden olabilmektedir. Bu nedenle, belirli bazı klasörlerin bu tür uygulamalar tarafından taranmaması gerekir. Bu linkteki makalemde detaylı bilgi bulabilirsiniz (makale biraz eski olduğundan sadece .NET 1.1'den bahsediyor ama aynı şeyler 2.0 için de geçerlidir).
  3. Sunucunun olay günlüklerini (event log) izleyin. Herhangi bir nedenle uygulamanızı çalıştıran "process" kapancak olursa, uygulama olay günlüğüne (application event log) mutlaka bir kayıt düşecektir. IIS 6.0 için dikkat etmemiz gereken kayıtların bazıları 1002, 1009, 1010 ve 1011 numaralı kayıtlar olacaktır.

Yukarıda saydığım nedenlerin dışında, "session"ların kaybolmasına neden olabilecek bilinen bir sorun bulunmamaktadır.

CENK ISCAN