2010-12-14 81 views
2

我正在嘗試爲我的網站上的每個客戶端創建一個會話代碼。在全球ASAX的在session_start我有這樣的代碼:ASP.NET會話標識符

private static long codSesion = 0; 
private static object codSesionLocker = new object(); 
protected void Session_Start(object sender, EventArgs e) 
{ 
    if (Session["CodSesion"] == null) 
    { 
     lock (codSesionLocker) 
     { 
      if (Session["CodSesion"] == null) 
      { 
       if (codSesion == 9999) 
        codSesion = 0; 
       codSesion++; 
       Session["CodSesion"] = codSesion; 
      } 
     } 

    } 
} 

當監控這似乎是完美的。經過一段時間的不活動開始出現問題。發生的一件事情是,從1開始的次數太多(沒有達到9999且沒有IIS回扣)。最近,甚至比taht還糟糕:我使用了代碼1和2.我停止使用服務器(使IIS無活動)。將近1小時後(50分鐘),我再次嘗試。 IIS給我的代碼是2(與上一代碼2不同)。

請我真的會對此有所幫助。

+0

您是否有任何代碼可以根據您的請求實際訪問會話? – Restuta 2010-12-14 14:35:51

+0

順便說一句,爲什麼你不這樣做? http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx – Restuta 2010-12-14 14:37:22

+2

你到底想達到什麼目的?會話已經一個id:SessionID的... – 2010-12-14 14:37:51

回答

3

我不知道這是否說明你上面列出的行爲,但默認情況下,IIS中的應用程序池將在一段時間內無回收(這些設置可以在IIS中改變每個應用程序池)。當應用程序池回收時,池的新實例將完全重新初始化。

+0

謝謝,這實際上是發生了什麼事。我實現了@rdkleine溶液(保存codSesion在一個文件中),現在它的工作原理 – Diego 2010-12-14 15:57:34

2

IIS回收工作進程,在那裏你將失去codSession的靜態值。

將信息保存在文件或數據庫中以解決此問題。

2

經過一段時間不活動後,IIS將停止您的應用程序。一旦有人訪問,該網站將重新開始。將它與您可能正在使用進程會話狀態的事實結合起來,這就是爲什麼您會看到重置值。

您可以嘗試使用SqlServer存儲會話如這裏所描述,使數據被持久:

MSDN - ASP.NET Session State

即使這樣的作品,試圖以這種方式使用Session是一個壞主意。根據你想要達到的目標,有更好的方法來處理事情。