Etiketler

, , ,


StateServer da Session_End Olayın Yakalanması

ASP.Net de oturum bilgilerini (session) InProc haricinde bir yapıda (StateServer , SqlServer)saklamak isterseniz, Global.asax içersinde yer alan ve oturumun sonlandığında tektiklenen Session_End olayı tetiklenmeyecektir. Bu durumda oturumun sonlanıp sonlanmadığına dair kontrolu sizin gerçekleştirmeniz gerekmektedir. Bunun için bir HttpModule yazmanız gerekecektir.

Daha önce hiç HttpModule yazmadıysanız aşağıdaki yazıları okumanızı tavsiye ederim. Çünkü bu yazımızın içeriği, oturum verilerini özellikle StateServer yada SqlServer da tutanlar için önemli bir tecrübe paylaşımından oluşacaktır.

Session_End olayını eğer oturum verilerini InProc tutmadığımız zaman nasıl yakalayacağız ?
Teknik aslında sade ve basit bir mantık üzerine kuruluyor. Öncesinde bilmeniz gerekenler ;

  1. Her bir oturum için, sistem tarafından otomatik olarak üretilen bir nesne var mıdır ?
  • Verilerimi ön bellekte (Cache) de saklarsam, buradan bir eleman çıkartıldığında haberim olur mu?

İlk sorumuzun cevabı SessionID olacaktır. SessionID her bir oturum başlatıldığında mevcut oturuma otomatik olarak atılan nesnedir. Bu nesne oturum süresince sistemde saklanır. Oturum sonlandığında ise kaybolur.
İkici sorumuzun cevabı ise Cache attığınız bir nesne çıkartıldığında, New CacheItemRemovedCallback(…) olayı ile çıkartılan nesneyi yakalıyabilirsiniz.

HttpContext.Current.Cache.Insert(ByVal key As String, ByVal value As Object, ByVal dependencies As System.Web.Caching.CacheDependency, ByVal absoluteExpiration As Date, ByVal slidingExpiration As System.TimeSpan, ByVal priority As System.Web.Caching.CacheItemPriority, ByVal onRemoveCallback As System.Web.Caching.CacheItemRemovedCallback)

Öyleyse yapmamız gereken, SessionID yi Cache ‘e atmak olacaktır. Çünkü oturum sonlandığında bu eleman otomatik olarak cache listesinden çıkartılacaktır. Bu elemanın çıkartıldığını, hazırladığım bir olay ile yakalarsam, hangi oturumun sonlandığını tespit edebilirim. Bu sayede, StateServer da session bilgilerimi tutuyor olmama rağmen, dolaylı yoldan olsa da Session_End olayı yakalamış olacağız.

İlk olarak HttpModule ‘ müzün olmazsa olmaz kısımını, IHttpModule arayüzünün metotlarını uygulayarak başlıyoruz.

Bizim için önemli olan nokta ;

AddHandler _httpUygulamasi.PreRequestHandlerExecute, AddressOf OturumYonetimiIsleminiGerceklestir

tanımlamasıdır. OturumYonetimiIsleminiGerceklestir işlevi içersinde yukarıda bahsettiğimiz mantığının kodlamasını gerçekleştireceğiz.

Cache listesinden herhangi bir eleman çıkartıldığında, OnBellektenElemanCikartildigindaCalisacakIslev i tetiklenecek. Amacımız sadece oturumun sonlandığını yakalamak olduğu için, Cache listesinden çıkartılan elamanın, sadece çıkartılma sebebinin “CacheItemRemovedReason.Expired” olduğu durumu kontrol ediyoruz.

Akabinde OturumSonlandiEvent olayı için kullanılacak olay verilerini içerecek OturumSonlandiEventArgs sınıfı hazırlayarak,

çalışmamızı tamamlıyoruz.

Web.Config dosyasında aşağıdaki eklemeyi gerçekleştirip,

Global.asax içersinde aşağıdaki eklemeleri yaptığınızda,

çalışmamız tamamlanmış olacaktır.

Örnek kodları http://www.mehmetozakan.com/download/OturumSonlandiModule.rar adresinden indirebilrisiniz.

Bu konu ile ilgili aşağıdaki yazıları okumanızı öneririm.