WCF ve ASP.Net oturumları

   Bir süre önce bloğumda yayınladığım WCF’e giriş makaleme gelen WCF ve ASP.Net oturumları sorusuna verdiğim kısa yanıtı ayrı bir makale ile ele almanın daha faydalı olacağını düşündüm.

   Konuya başlarken, öncelikle soruyu hatırlayalım;

Fatih hocam selamlar,

Makaleniz için çok teşekkür ederim. Çok işime yaradı. Şimdi bu konuyla ilgili bir soru sormak istiyorum.

Ben WCF i ASP.NET ‘te kullanıyorum.

ConcurrencyMode = Multiple,
InstanceContextMode = PerSession

kullanıyorum.

Ayrıca IsInitiation=true olarak tek bir metodum var.

Şimdi hocam sorum şu :
WCF nesnesini, asp.net ‘te nasıl create edeceğim ki, bütün sayfalarda oluşturduğum bu tek nesneyi kullanayım. Static olarak tanımlarsam, diğer kullanıcılarda aynı kanaldan giriş yapıyor. Ben her bir session ‘un ayrı bir nesne create etmesini istiyorum.

Bilemiyorum anlatabildim mi?

Yardımlarınız için çok teşekkür ederim.

   Aslına bakarsanız bu sorunun yanıtı için bir kaç farklı noktadan konuyu incelememiz lazım. Öncelikle WCF oturumları (sessions) ile ASP.Net oturumlarının (sessions) birbirlerinden farklı olduğunun altını çizmek gerekir. İkisi tamamen farklı iki yaklaşıma sahiptir;

  • WCF oturumları tam olarak sunucuda bir nesne örneğine denk gelmektedir. Yani InstanceContextMode = PerSession şeklindeki bir ifade ile her bir istemci için sunucuda yeni bir servis nesnesi oluştur demiş oluyorsun. Hatta aynı uygulama içerisinde açacağınız ikinci, üçüncü bir istemci de birbirinden bağımsız oturumlar başlatacaktır. Bu oturumların her birisi hafızada yer alan bir nesne ile temsil edildiği için servisinizin aynı anda destekleyebileceği oturum sayısı nesnenin boyutu ve sahip olduğunuz hafıza alanı ile doğru orantılıdır.
  • ASP.Net oturumları ise daha çok ortak kullanılan bir alan olarak düşünülmelidir. Varsayılan olarak hafıza olan bu alan istenirse MSSql, Window Azure AppFabric ya da MemCache gibi 3. parti sağlayıcılarda da tutulabilir. Verinin ayrı bir sağlayıcı üzerinde tutuluyor olması tüm uygulamanın her bir oturum için ayrı örneklerinin olması ihtiyacını da ortadan kaldırmakta.

   Yukarıdaki bilgiler ışığında WCF oturumları ile ASP.Net oturumları arasındaki bir diğer önemli fark da başlama şekilleridir. ASP.Net oturumları sunucu tarafında kontrol edilmektedir. Bir ASP.Net oturumunun ne zaman başlayıp ne zaman sonlanacağı sunucuda çalışan kodun verdiği bir karardır. Bir uygulama için oturumun başlaması istemcinin sisteme giriş sayfasında verdiği doğru kullanıcı bilgileri sonrasında olabilirken, bir diğer uygulama için istemcinin ilk isteği olabilir. Benzer bir durum oturumun sonlanması için de söz konusudur. Öte yandan WCF hizmetlerinde oturum tamamen istemci tarafından kontrol edilmektedir. İstemci istediği noktada oturum bilgilerini WCF hizmetine gönderebilir, göndermediği zaman sunucu bu durumdan haberdar dahi olmayacaktır. İstemci ne zaman bağlantısını keserse WCF hizmetindeki oturum da sonlanacaktır.

   İsterseniz konuyu biraz daha açayım; Web browser’ları 1994 yılındaki ilk kullanımından beri istemci tarafında kısa bilgiler tutan çerezleri (cookie) desteklemektedir. İstemcinin bir web sitesini ziyareti sırasında sunucu uygulamasının istemcide basit anahtar-değer ikilileri tutmasına olanak veren çerezler bu özellikleri sayesinden web uygulamalarının oturum desteğine sahip olmalarının da önünü açmışlardır. Bir oturum başlatmak isteyen web uygulamasının yapması gereken tek şey bu oturumu işaret eden tekil bir değeri istemcideki çerez içerisinde saklamaktır. İstemcinin bir sonraki isteğinde bu çerez bilgisi de sunucuya iletilecek, dolayısıyla da istemci farkında olmadan oturumuna kaldığı yerden devam edebilecektir.

  Web uygulamalarındaki 1994’ten beri süre gelen bu doğal yeteneğin aksine web servislerinde varsayılan olarak bu destek bulunmamaktadır. Dolayısıyla basit web servislerinde bu desteği farklı yollarla sunabiliriz. Bunun en basit yolu da bir oturum anahtarının her web çağrısında bir parametre ile talep etmektir. Bu yöntemin ise en önemli dezavantajı tamamen istemci uygulamasını geliştiren kişinin kontrolünde olmasıdır. Bu durum göz önüne alınarak aynı web uygulamalarında olduğu gibi istemciden başlık kısmında bir anahtar değer ikilisinin iletilmesi talep edilebilir. BasicHttpBinding basit düzeyde bir web servis istemcisi oluşturduğu için paylaştığım bu ikinci senaryoyu desteklememektedir. WS binding ise oturum bilgisini sunacak olan bu mekanizmayı desteklemektedir. WSHttpBinding istemcileri biz farkında olmadan sunucu ile aralarında bir oturum başlatarak her istekte bu bilgiyi mesaıjn başlık bölümünde sunucuya ileterek oturumu arka planda yönetmektedirler. Bu şekilde oturum mekanizmasını bir nevi taklit etmiş olurlar.

  Her ne kadar WCF denilince akla en çok web servisleri gelse de, WCF sadece web servislerinden ibaret değildir. NetTcpBinding ve NetNamedPipeBinding gibi binding’ler alt taraftaki TC, IPC protokolleri sayesinde doğal olarak oturum yeteneğine sahiptirler.

  Her ne kadar WCF oturumları daha da fazla detaya sahip olsa da başta paylaştığım soruya yanıt için bu kadar detay sanırım yeterli olacaktır.

  Konuyu toparlayarak sorunun yanıtına bağlamak gerekirse; sanırım şimdiye kadar ki paylaştığım bilgiler ASP.Net oturumları ile WCF oturumlarının ne kadar farklı olduğunu sizlere göstermiştir. Bu durumda bir WCF oturumundan ASP.Net oturumuna ulaşmanın nasıl farklı bir şey olduğunun netleştiğini umuyorum.

   Tabi ki farklı mekanizmalara sahip bu iki sistemin bir payda da buluşabilmesi mümkün. Bunun için yapılandırma dosyasına aşağıdaki girdiyi eklemelisiniz;

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

  Bu WCF’in ASP.Net ile uyumlu bir süreç içerisinde çalışmasını sağlayacaktır. Bu sayede istemcinin WCF servislerine yaptığı isteklerde ASP.Net oturumunu belirten tekil değeri de sunucuya iletmesi sağlanacaktır. Bu şekilde ASP.Net oturum anahtarını bilen WCF hizmeti bu anahtarı kullanarak oturum bilgilerine ulaşabilecektir.

  Gördüğünüz gibi aslında WCF hizmetlerinin ASP.Net oturumlarına ulaşması sihirli bir süreç değil. Arka planda olup bitenleri bildikten sonra böylesi bir mekanizma bizler tarafından da kolaylıkla tasarlanabilir.

  Sorumuza geri dönecek olursak; yaşanılan tek sıkıntı yapılandırma dosyasına ASP.Net ile uyumlu modda çalışılması gerektiğinin belirtilmemesi değildir. Her ne kadar soruda detay yer almasa da tahminimce her defasında ASP.Net uygulaması yeni bir istemci oluşturmakta; ki bu durum da da yazımın başlarında bahsettiğim gibi her biri için yeni bir WCF oturumu başlatılmaktadır 😉

   Paylaştığım bu bilgilerin ardından tabi şu soruyu da sormadan edemiyorum; Neden?! Neden bir WCF hizmeti içerisinden ASP.Net oturumuna erişilmesi gerekli? WCF hizmetleri kendi başlarına çalışan bağımsız web metodları olarak düşünülmeli. Aynı işlemi uygulamanız içerisindeki bir metod içerisinde yapsaydınız ihtiyacınız olan parametreleri zaten dışarıdan geçmez miydiniz? Şayet ASP.Net oturumunu güvenlik için kullanmayı düşünüyorsanız, bunun için daha iyi yöntemler var 😉

   WCF oturumlarının ASP.Net oturumlarından farklı olarak hafızada (in-memory) bulunması nedeniyle oturum bazlı işlemler yapıyorsanız beraberinde de önemli bir ölçeklendirme probleminiz de olacaktır. Bir NLB arkasındaki birden fazla makine ardında oturumları yönetebilmek için NLB’yi iyi yapılandırmanız gerekecektir, zira farklı bir makineye düşen istemci demek sıfırdan açılmış bir oturum demek olacaktır…

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

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