2010-12-14 48 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是一个坏主意。根据你想要达到的目标,有更好的方法来处理事情。