Skip to main content

ASP.NET WebForms’da Sahte Sessionless Sayfalar Üretmek

Başlıkta neden “Sahte Sessionless Sayfa” dediğimi düşünebilirsiniz, nedeni ASP.NET Webforms’da sessionless(yani session taşımayan) sayfa yapmak mümkün değil. Mümkünse de ben 2 gün boyunca denedim, araştırdım, internette çözümünü bulamadığım gibi hatırı sayılır kaynaklarda “InProc modda sessionless sayfa olmaz” bilgilerini gördüm. Ancak bu yazıda bir projede sessionless bir sayfadan beklentimiz ne ise, onu gerçekleştirmemizin yolunu anlatacağım. Yani sahte sessionless sayfaları nasıl kullanabileceğimizi inceleyeceğiz.

Konuya giriş yapmadan önce neden böyle birşeye ihtiyaç duyabileceğimizi izah etmeye çalışayım. Bildiğiniz gibi Session belirli bir zaman aşım süresi olan ve istemcinin sunucuya talep yapmasıyla bu sürenin ötelenmesi mantığıyla çalışan bir nesnedir. Bir web uygulamasında oturum açtıktan sonra size (genellikle) 20 dakikalık bir süre verilir. Bu süre bitmeden yapacağınız her talepte süre yeniden 20 dakika olarak belirlenir ve önünüzdeki 20 dakika boyunca web uygulaması tarafından tanınırsınız. Bu durum web uygulamasındaki tüm dosyalar için geçerlidir. Yani siz aspx, ashx, htm gibi bir dosyaya talep yaptığınızda istemciden alınan SessionID sunucuya iletilir ve sunucu sizi tanıyarak oturumunuzu 20 dakika daha geçerli yapar. Peki, “uygulamamdaki bir dosyaya talep yapıldığında session çalışmasın ve zaman aşım süresi ötelenmesin” gibi bir isteğim olursa bunu nasıl yapabilirim? Zira uygulamadaki uzantısına bakılmaksızın hangi dosyaya talep yapılırsa yapılsın, session süresi uzar demiştik. Yani istemci bir sayfaya talep yapsın ama bu talep esnasında session işlemesin durumunu gerçekleştirmek istiyoruz.

Yukarıdaki paragrafı okuduğunuzda “tamam ben sorunu anladım, ama benim böyle bir senaryoya niye ihtiyacım olsun ki?” diyebilirsiniz. Bir aksilik olmazsa size bu konunun uygulandığı güzel bir örnek içeren yazıyı yakın bir zamanda blogumda göreceksiniz diyeyim ve az da olsa sizleri meraklandırayım :)

Öncelikle normal şartlarda session nasıl çalışıyor görelim, sonrasında da neleri değiştirerek sahte sessionless sayfa üretebileceğimizi inceleyelim. Projede yer alan bir alt klasörü ayrı bir uygulama olarak tanımlamamız gerekiyor, bu nedenle projeyi local IIS üzerinde oluşturmamız ve Visual Studio’dan da Local IIS sekmesini kullanarak projeyi açmamız gerekecek. Projeye adları Default.aspx, Default2.aspx ve subsite adındaki bir dizinde FarkliSession.aspx adıyla 3 dosya ekliyorum. Anlaşılacağı üzere sahte sessionless sayfamız olan FarkliSession.aspx’i ancak farklı bir dizinde tanımlayarak kullanabiliyoruz. Örneği incelemek için bir butonun click eventinde gelişigüzel bir Session nesnesi oluşturarak tüm sayfalardaki SessionID bilgisine bakıyoruz. Aşağıdaki 3 sayfamızın kodları görünmektedir.

//Default.aspx
public partial class _Default : System.Web.UI.Page
{
    protected void Page_PreRender(object sender, EventArgs e)
    {
        if(Session["dummy"] != null)
            Response.Write("SessionID: " + Session.SessionID);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["dummy"] = "herhangi bir değer";
    }
}
//Default2.aspx
public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("SessionID: " + Session.SessionID);
    }
}
//subsite/FarkliSession.aspx
public partial class subsite_FarkliSession : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("SessionID: " + Session.SessionID);
    }
}

Default.aspx sayfasını çalıştırıp oturum açıyoruz ve sonrasında yeni pencerelerde Default2.aspx ve FarkliSession.aspx sayfalarını açıyoruz. Aşağıdaki ekran görüntüsünden de anlaşılacağı üzere tüm sayfalarda SessionID aynı.

Tüm sayfalarda SessionID aynı gelmekte

Resimde gördüklerimiz zaten beklenen değerler. Gelelim FarkliSession.aspx sayfasını sessionless yapmaya. Bu işlem için öncelikle subsite isimli klasörü IIS’de Convert Application seçeneğinden bir uygulamaya çeviriyoruz. Aşağıdaki resimden ilgili işlemi yapacağımız menüyü görebilirsiniz.

subsite isimli dizini IIS’den ayrı bir uygulamaya çeviriyoruz

Artık bu dizin IIS bazında uygulamadan ayrı çalışacaktır. Ancak bu işlem sessionless sayfa üretmek için yeterli değildir, zira yukarıda Default.aspx
sayfasında butona tıklatarak izlediğimiz işlemleri tekrarlarsanız halâ sayfalarda aynı SessionID’lerin olduğunu görürsünüz. subsite dizini uygulamadan ayrılsa dahi IIS bu dizindeki dosyalarında istemciye gönderilmesi esnasında aynı isimli Cookie dosyalarını kullandığı için aynı cookie’lere sahip sayfalar olmakta ve aynı SessionID bilgisini taşımaktadırlar. İşlemin son adımında subsite dizini içerisine bir web.config dosyası ekliyor ve bu dizindeki dosyalara ait çerezlerin farklı bir cookieName bilgisine sahip olduklarını belirteceğiz. Aşağıda subsite dizinine eklediğimiz web.config dosyasının içeriği yer almaktadır.

subsite/web.config
<?xml version="1.0"?>
<configuration>
    <system.web>
      <sessionState cookieName="subsite_cookie"></sessionState>
    </system.web>
</configuration>

Bu değişikliği de yaptıktan sonra artık FarkliSession.aspx sayfasının farklı bir SessionID’ye sahip olduğunu görebiliyoruz. En azından aşağıdaki resimde öyle görünüyor :)

Yapılan düzenlemelerden sonra subsite dizini altındaki sayfalarda farklı bir SessionID’ye ulaşıyoruz

Bu şekilde farklı bir uygulamaya ihtiyaç duymadan, aynı uygulama altına IIS’de bir alt uygulama tanımlayarak sahte sessionless sayfa kullanabiliyoruz. Yazının başından beri “Sahte” kelimesini kullanmamızın sebebi, aslında bu sayfanın ana uygulamadaki session’dan farklı olarak ayrı bir session nesnesi taşıyor olmasıdır.

ASP.NET WebForms’da Sahte Sessionless Sayfalar Üretmek” hakkında 5 yorum

  1. Hocam web projesini New web site diye oluşturunca problem yok lakin projeyi
    web application diye oluşturup subfolder’rı ayrı bir uygulamaya dönüştürünce
    Parser Error Message: Could not load type hatası veriyor
    Bu işlemi gerçekleştirmek için new web site altındanmı projeyi oluşturmak gerekiyor.
    Web application olarak oluşturduğumuz projede sahte sessionless oluşturamıyor muyuz?

  2. Yazının içerisinde önemli bir not olarak projeyi local IIS üzerinden çalıştırmamız gerektiğini belirtmiştim. Dolayısıyla bu hata normal. Erişememe durumu sadece development aşamasında, IIS dışından çalıştırınca oluyor. Canlı ortama aktarıldığında sorun çıkmaz.

  3. Merhabalar. Aynı sorun bende de var ancak IISS üzerinden calıstırmak nedir nasıl yapılır anlayamadım? Yardımlarınız icin simdiden tesekkür ederim

  4. Merhabalar. Benim farklı bir sorunum var. Asp.net ile yaptığım 2 adet farklı web sayfaları var. İkisi de aynı sunucuda barınmakta. AltKlasörde çalışmaktadır. Açılan ilk sayfada oluşturduğum session değerini bir link ile diğer uygulamayı açtığımda da yakalamak istiyorum. Ancak başaramadım, değer null dönmekte. SessionState ile yapılabildiğini okudum ama maalesef beceremedim. Yardımcı olabilir misiniz ?

    İyi çalışmalar.

  5. Merhaba. Sanırım SessionID değeri ile Session objesine erişmek istiyorsunuz. InProc modda SessionID değeri ile Session objesine doğrudan erişim mümkün değil diye biliyorum. Eğer Session objelerini kendiniz manuel olarak Application seviyesinde bir List vb nesne oluşturup saklarsanız ve Session’a her erişimde de bu List’i güncellerseniz sağlıklı şekilde Session bilgilerine erişim sağlayabilirsiniz.

    Bir diğer yöntem de Session bilgilerini SQL Server’da saklamak. Tabloda SessionId bilgisi de saklandığı için aktif Session’ları(hatta expire olmuşları Session’ları da) tablodan sorgulama şansınız olur. Tabi Session bilgilerini SQL Server’da saklamanın performans açısından olumsuz yansımaları olabilir uygulamanıza.

Bir Cevap Yazın

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