Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - Alacakaranlık Kuşağı : SessionID
Kişisel Blog
 
 Saturday, August 02, 2008

Dün bir problemle uğraşırken çok ilginç bir şey keşfettim ve bunu paylaşmak istedim.

Konu SessionID ve global.asax hakkında.

Bunu bir örnek üzerinden anlatmak isterim:

Önce Default.aspx’e bir adet HyperLink kontrolü atalım. Maksat, bu linkten Open In New Browser diyerek test edeceğimiz sayfadan birden fazla açmak. Böylelikle aynı session’a sahip birden fazla sayfaya sahip olabileceğiz.

Şöyle bir kod yeterli olacaktır.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">Test Sayfam</asp:HyperLink> 

    </div>

    </form>

</body>

</html>

 

Daha sonra ikinci sayfamıza (Default2.aspx) gelelim ve  sonra form load’a session Id’yi gösteren bir kod yazalım.

<%@ Page Language="C#" AutoEventWireup="true"  %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<script runat="server">

 

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.Write(Session.SessionID);

    }

</script>

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

  

    </div>

    </form>

</body>

</html>

Projemizi çalıştırdığımızda çok ilginç bir şeyle karşılaşıyoruz. Default.aspx’te Link üzerinden Open In New Tab dediğimizde her sayfanın farklı bir session Id’yle açıldığını görüyoruz.

 

Uğraştığım problemin çözümü için hayati önemli bir durumdu bu. Kafayı yiyerek İki tane çözüm buldum:

Birincisi bir sayfanın herhangi bir yerinde session’a bir değer atarsam problem kendiliğinden çözülüyordu. Şöyle ki (Default.aspx’te)

<%@ Page Language="C#" AutoEventWireup="true"  %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<script runat="server">

 

    protected void Page_Load(object sender, EventArgs e)

    {

        //Ne yazdığınızın hiç bir önemi yok

        Session["Hede"] = "hödö";

    }

</script>

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">Test Sayfam</asp:HyperLink> 

    </div>

    </form>

</body>

</html>

 

Burası çalıştıktan sonra tüm sayfalarım aynı session ID’yi verdi. Ancak bu yine bir çözüm değildi. Kullanıcı bu sayfaya uğramadan direk sessionID’nin kullanıldığı sayfaya (yani Default2.aspx’e) erişebilirdi.

Hal böyle olunca ben de Global.asax kullanmaya karar verdim ve oldukça ilginç bir şey keşfettim:

Projeye Global.asax ekleyince hiç bir şey yapmasınız bile Session Id’ler doğru çalışıyor.

Acaba bu sadece Visual Studio’nun web server’ındaki bir sorun mu diye düşündüm ve projeyi IIS’te test ettim ve farkettim ki IIS de aynı şekilde davranıyor.

Buradan çıkardığım sonuç şu:

 

Eğer SessionID kullanacaksanız, projenizde mutlaka Global.asax kullanın, yoksa sürprizlere uğraşmak zorunda kalabilirsiniz.

İlginç !

Saturday, August 02, 2008 11:54:40 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):

Copyright © 2009 Yalçın Uzun