![]() |
|
|
#1 | ||
|
Senior Member
Üyelik tarihi: 29-07-2008
Mesajlar: 1.000
|
Programlama mantığı olarak düşünmek gerekirse, Session bellekte tutulan bir Hash Tablosundan veya bir sözlükten farkı yoktur. Örneğin, sizin siteniz ziyaretçilerin kendilerine özel kullanıcı adı ve şifreleriyle girebildikleri bölümler içeriyorsa, sisteme her giren üyenin ismi ve kullanıcı adı Session nesnesinde tutulabilir:
Session["uye_adi"] = "misafir"; Session["ip"] = Request.ServerVariables["REMOTE_ADDR"].ToString(); Ziyaretçi sitenizde gezmeye devam ederken, yeni bir sayfada üyenizin bilgilerine ihtiyaç duyduğunuzda, bu bilgiler kullanıcı tarafından yeniden girilmesine gerek kalmadan Session nesnesinden okunabilir. // Üye ‘ nin adını almak string uye_adi = Session["uye_adi"].ToString(); Klasik ASP Session nesnesinde, client taraftaki ziyaretçiye benzersiz (unique) bir değer atanıyordu. Bu değer, client tarafından her bir istekde (request), server’a gönderilen HTTP Cookie içinde saklanıyordu. Server cookie içindeki değeri okur ve Session nesnesine gerekli değerleri atardı. Klasik ASP Session Nesnesindeki Problemler ASP geliştiricileri Session nesnesinin önemli bir özellik olduğunu bildikleri kadar, bazı noktalarda yetersiz kaldığını da biliyorlardı. Bu noktalar; Süreç Bağımlılığı (Process Dependent) : ASP Session nesneleri, server tarafta bir süreçle oluşturuluyordu. Server tarafta olacak bir süreç kaybı veya hatası, otomatik olarak Session nesnesinin kaybına yol açıyordu Server Sınırlaması (Server Farm Limitations) : Ziyaretçiler, Internette bir siteden başka bir siteye geçtiklerinde Session’ları onlarla birlikte gelmiyordu. Yani ASP Sessionları makine (server) spesifikti. Her ASP Server’ı kendisine özel Session nesnesi sunuyor ve ziyaretçi aynı Server’ı yeniden ziyaret edene kadar, Session nesnesi ulaşılamazdı.. Cookie Bağımlılığı (Cookie Dependent) : HTTP Cookielerini kabul etmeyen ziyaretçiler, Session nesnesinin getirdiği faydalardan yararlanamıyordu.Bazı ziyaretçiler, cookielerin özel yaşamı ve güvenliği tehlikeye attığını düşündüklerinden, cookielere izin vermiyorlardı. Tüm bu sorunlar göz önüne alınarak, yeni ASP.Net Session nesnesi geliştirilmiştir; ASP.NET Session Nesneleri ASP.Net Session nesnesi, yukarıda değindiğimiz tüm sorunların çözümlerini beraberinde getirmektedir; • Süreç Bağımsızlığı (Process Independent) : ASP.Net Session nesneleri, server üzerinde koşan süreçlerden ayrı olarak yürütülürler. Bu sayede server üzerinde çalışan diğer süreçlerde oluşacak kayıp ve hatalar, Session süreçlerini etkilemeyecektir. • Farklı Serverların Desteklenmesi (Support for server farm configurations) : Yeni ASP.Net Sessionları, farklı serverlar tarafından paylaşılabilecek şekildedir. Bu işlem, ASP.NET konfigürasyonunu Common Server yaparak gerçekleştirilebilir. • Cookie Bağımsız (Cookie Independent) : Cookie’siz durum yönetme çözümleri klasik ASP için de var olsa da, bunları ASP.Net de yerine getirmek daha kolay ve güvenilirdir. ASP.NET Session Nesnesinin Kullanımı Session nesne özellikleri, ASP.Net de XML yapıda olan konfigürasyon dosyalarıyla gerçekleştirilir. İki tip konfigürasyon dosyası bulunmaktadır: Makine Konfigürasyon Dosyası ve Uygulama Konfigürasyon Dosyası. Bu dosyaları birbirinden ayıran özellikleri, makine konfigürasyon dosyası tüm uygulamalar için geçerli olan özellikleri içinde barındırır. Uygulama (Application) konfigürasyon dosyası ise, tek bir uygulama (çalışılmakta olan uygulama) için geçerli olan özellikleri içinde barındırır. Makine konfigürasyon dosyası sisteminizde WinNT\Microsoft.NET\Framework\(versiyon)\CONFIG klasörü altında (machine.config) bulunmaktadır. Her uygulamanın kendi klasörü içinde ise Uygulama (Application) konfigürasyon dosyası (web.config) bulunur. Eğer Application konfigürasyon dosyası uygulama klasöründe bulunmazsa, makine konfigürasyon dosyasında bulunan özellikler kullanılır. NOT:ASP.NET de web.config dosyasında yapmış olduğunuz değişiklikler ASP den farklı olarak o anda geçerli olur. Server’ı durdurup yeniden başlatmanıza gerek yoktur. Session Konfigürasyonu Aşağıdaki örnek web.config dosyasında, Session nesnesi için yapılabilecek özellikleri göstermektedir; Örnekte verilen değişkenleri açıklamak gerekirse; • Mode: Mode özelliği 3 farklı değer almaktadır: InProc, SQLServer ve StateServer. Bu değerler, büyü-küçük harf duyarlıdır (case sensitive). Bu modlar iki ana başlık altında toplanır; In Process ve Out of Process modları. • Cookieless : Cookie kullanımını belirler. True ise cookie kullanılır, False ise kullanılmaz. • Timeout: Session nesnesinin geçerli olacağı süreyi belirtir. Yeni bir istek geldiğinde, o anki süre üzerine Timeout değeri de eklenerek, Session’ın geçerli olacağı yeni süre hesaplanır. • SqlConnectionString: SQLServer modunda kullanılan veritabanına bağlantı cümlesidir. • StateConnectionString : StateServer modu için gerekli olan ASPState servisinin çalıştığı server’ın adresini belirtir. Örnek Uygulama : Şimdi küçük bir uygulama yapalım. Örneğimizde Session nesnesine bir değer yazıp okuyacağız. Öncelikle, Visual Studio’u açıp yeni bir proje oluşturun. Proje sorunsuz olarak açıldıktan sonra, aspx sayfanızın ismini SessionDurumu.aspx olarak değiştirin. Ardından sayfaya bir TextBox, iki Button ve bir tane de ListBox ekleyin. Buttonlardan birinin Text özelliğini “Session Oku”, diğerininkini ise “Session Yaz” olarak değiştirin. Şimdi sıra, “Session Oku” butonunun OnClick olayına gerekli kod parçasını yazmaya geldi. private void Button1_Click(object sender, System.EventArgs e) { if (Session["state"]==null) { list.Items.Add(""); list.Items.Add("Session değeri boş"); list.Items.Add("Lütfen kullanmadan önce bir değer atayınız!"); } else { list.Items.Add(""); list.Items.Add("Okunan Session değeri : " + Session["state"].ToString()); } } Yukarıda görüldüğü gibi, “Session Oku” butonuna tıkladığınızda, öncelikle Session[“state”] değerinin NULL olup olmadığı kontrol ediliyor. Session değerlerini okumadan önce bir değer atamazsanız, otomatik olarak Session nesnesinin alacağı değer NULL olacaktır. Örnek kodumuzda, Session[“state”] değeri NULL’dan farklı ise, “list” ismini verdiğimiz ListBox’a Session’ın içindeki değer yazdırılacaktır. “Session Yaz” butonunun OnClick olayına ise aşağıdaki kod parçasını yazın; private void Button2_Click(object sender, System.EventArgs e) { Session["state"]= deger_textbox.Text; list.Items.Add(""); list.Items.Add("Session Değeri Yenilendi"); list.Items.Add("Session'ın yeni değeri :" + Session["state"].ToString()); } Yukarıdaki kod parçasında, Session nesnesine, TextBox’a girilen değer atanıyor ve ardından ListBox içine Session nesnesinin yeni değeri yazdırılıyor. Session State Modları Dört genel konfigürasyon modu vardır; in-process Mod, out-of-process Mod, SQL Server Mod ve Cookieless Mod. In-process Mod In-process Mod, klasik ASP Session State ile aynıdır. Yani, session süreç (process) tarafından yönetilir ve eğer süreç kaybolur veya herhangi bir sorun olursa, session da kaybolmuş olur. ASP.Net'in getirdği yeniliklere rağmen yine de bu yöntemi seçebilirsiniz. Nedeni ise çok basit : Performans. İlerde görecek olduğumuz SQL Server'dan Session State'i okumak, Session sözlüğünden sürecin değer okumasından daha yavaştır. In-process Mod, ASP.Net için varsayılan değerdir. Bu özellik kullanıldığında, config.web dosyasında yer alan özelliklerden cookieless ve timeout özelliği kullanılabilir. SessionDurumu.aspx sayfasını çalıştırıp, session değerini setleyin (Session Yaz butonu ile). Ardından, ASP.NET sürecini durdurup yeniden başlatın (bir komut penceresi açıp, "iisreset" komutunu çalıştırın). Session değerini okumak istediğinizde, Session değerinin kaybolduğunu göreceksiniz. (Session değeri NULL olacaktır) Out-of-process Mode .NET SDK bir Windows NT Servisi olan ASPState'i içinde barındırır. Bu servis, out-of-process Modunun yönetilmesinde kullanılır. Bu servisi kullanmak için, öncelikle servisin başlatılması gerekir. Komut satırı açıp; net start aspstate yazdığınızda servis başlatılacaktır.Eğer sorunsuz olarak servis başlatılmışsa, aşağıdaki pencerede görülen çıktıyı görmeniz gerekir: Resim - 2. ASPState servisinin komut satırından başlatılması Bundan sonra, ASPState servisi çalıştığından, konfigürasyon dosyamızda gerekli değişiklik yaparak, session modu StateServer olarak değiştirebiliriz. NOT : Dikkat etmeniz gereken şey, "StateServer" değeri case sensitive değimiz küçük-büyük harf duyarlıdır. Yani, mode değerine "stateserver" atarsanız hata alacaksınızdır. <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20" /> Değişen tek şey, mod değerinin StateServer olmasıdır. Bu sayede, ASP.NET sistemde ASPState servisinin, stateConnectionString özelliğinde belirtilen makinede çalışıp çalışmadığını, belirtilen porttan (42424) kontrol edecek. SessionDurumu.aspx sayfasını yeniden çalıştırdığımızda, session değerini setleyip, IIS yi durdurup yeniden başlattığımızda (iisreset komutu ile), session değerinin kaybolmadığını göreceğiz. SQL Server Mode SQL Server Modu, Windows NT servisine benzer şekilde çalışır. Bu modda, Session bilgisi, bellekte tutulmak yerine, SQL Server da tutulmaktadır. Session state'i SQL Server da tutmak için öncelikle gerekli tabloların ve saklı yordamların (stored procedure) SQL Server üzerinde oluşturulması gerekir. .NET SDK, bu işlemi gerçekleştirebileceğimiz bir SQL scripti içerir. Bu scripti, WINNT\Microsoft.NET\Framework\(versiyon) klasörü altında bulabilirsiniz. SQL Server'da gerekli tabloları ve saklı yordamlı oluşturacak olan sql script "InstallSqlState.sql", oluşturulan bu tabloları ve saklı yordamları sistemden kaldıran script ise "UninstallSqlState.sql" isimli dosyalardır. Tablo ve Saklı Yordamların SQL Server'da Oluşturulması SQL Server'ın Session State'i tutabilmesi için gereken tablo ve saklı yordamları oluşturmak için, SQL Query Analyzer'ı açın. Ardından File → Open menüsünden InstallSqlState.sql dosyasını bulun. Dosyayı yakından incelediğinizde, script öncelikle sistemde, daha önce Session için kullanılan saklı yordamları ve geçici tabloları kaldırıyor. Ardından ASPState isminde bir database, DropTempTables, CreateTempTables, ResetData, TempGetAppId başta olmak üzere Session State'in yönetilmesi için saklı yordamlar oluşturmaktadır. Query → Execute menüsünden scripti çalıştırdığınızda, SQL Query Analyzer'ın Message kısmında, işlemlerin sorunsuz olarak gerçekleştiğine ilişkin mesajlar göreceksiniz. SQL Query Analyzer penceresini kapatıp Enterprise Manager penceresini açtığınızda, ASPState veritabanının ve ilgili saklı yordamların oluştuğunu kontrol edebilirsiniz. Resim-3 : Session State için SQL Server'a eklenen tablo ve saklı yordamlar SQL Server'da gerekli olan değişiklikleri yaptıktan sonra, konfigürasyon dosyanıza geri dönüp mode özelliğini SQLServer olarak atayın. sqlConnectionString özelliğindeki user id ve password alanlarına da geçerli kullanıcı adı ve şifresi atadıktan sonra, yapılması gereken değişiklikleri tamamlamış oluyorsunuz. <sessionState mode="SQLServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1; user id=sa;password=my_password" cookieless="false" timeout="20" /> Daha önce olduğu gibi SessionDurumu.aspx sayfamızı açıp Session nesnesine bir değer atayalım. Ardından IIS'yi durdurup yeniden başlatalım (iisreset komutu ile). Session nesnesini okumaya çalıştığımızda, session değerinin kaybolmadığını göreceğiz. Bunun yanında, birden çok SQL Server'ınızı Cluster yapıda kullanarak, herhangi birinde sorun olması durumunda, diğer SQL Server'ın araya girip session nesnesini saklamasını sağlayabilirsiniz. Cookieless State Son olarak, ASP.NET Session State'i cookieless olarak konfigüre edeceğiz. Bu konfigürasyon sayesinde, client tarafta cookiee'ler kabul edilmese bile session state kaybolmayacaktır. Session state'in korunma işlemi, URL 'ye tek ve benzersiz olan (unique) bir ID'nin eklenmesi ile sağlanır. http://localhost/(jks3ft35t21z5x55vln21s53)/Application/SessionDurumu.aspx ASP.NET, bu ID'yi client taraf, web sitesinde gezinmeye devam ettikte (sitedeki linkleri kullanmak şartı ile) Session state'in korunmasında kullanır. Eğer ziyaretçi, URL'yi yeniden yazarsa, session state kaybolacaktır (null olacaktır). Cookieless özelliğini, konfigürasyon dosyamızdaki cookieless özelliğine atayacağımız boolean (true; geçerli, False; geçerli değil) ile belirleyebiliriz. <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1; user id=sa;password=my_password" cookieless="true" timeout="20" /> NOT : Biz örneğimizde mod olarak StateServer modunu seçtik. Fakat tüm modlar cookieless özelliğini desteklerler. Performans ve Güvenilirlik Session State'in hangi modu'nu kullanacağınıza kara vermeden önce, aşağıdaki durumları göz önüne almanızı tavsiye ederim; In process :Bu mod size iyi bir performans sunacaktır. Çünkü, session state bilgisi ASP.NET süreci tarafından korunmaktadır. Tek bir web server üzerinde koşan uygulamalar için, session state bilgisinin önem taşımadığı durumlarda seçilebilecek çalışma modudur. Out of process : ASPState süreci Session State işlemini kontrol ettiği için performans olarak iyi bir sonuç verir. Ayrıca, session state'i kullanan farklı web server'ların olduğu bir yapı kullanıyorsanız, bu mod size güvenilir bir yapı sunacaktır. SQL Server : Eğer session state'in güvenirliği sizin için en önemli husus ise, bu mod size önerebileceğim tek moddur. Performans out-of-process modunda olduğu kadar iyi değildir fakat birden çok SQL Server'ın cluster bir şekilde çalışması durumunda, eğer ticari bir şirket iseniz, müşterilerinize güvenliği tam bir sistem sunmuş olursunuz. Eğer isterseniz,farklı şirketlerin size sunduğu Uzatılmış Session State Yönetim (Extended Session State Manager) sistemlerini de kullanabilirsiniz. Bunlardan en bilineni, Netscape'in LDAP (Lightweight Directory Access Protocol) directory sistemidir. |
||
|
|
|