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ç !