我正在尝试为我网站上的每个客户端创建一个会话代码。在全局asax的Session_Start中,我有这段代码:
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不同的PC中)。
请相信我对此有任何帮助。
答案 0 :(得分:3)
我不确定这是否解释了您在上面列出的所有行为,但默认情况下,IIS中的应用程序池将在一段时间不活动后进行回收(可以在IIS中为每个应用程序池更改这些设置)。当应用程序池循环使用时,池的新实例将完全重新初始化。
答案 1 :(得分:2)
IIS回收工作进程,你将失去codSession的静态值。
将信息保存在文件或数据库中以克服此问题。
答案 2 :(得分:2)
在一段时间不活动后,IIS将停止您的应用程序。一旦有人访问,该网站将重新开始。将其与您正在使用In Processes Session State的事实相结合,这就是您看到值重置的原因。
您可以尝试使用SqlServer存储此处描述的Session,以便持久保存数据:
即使这样可行,尝试以这种方式使用Session也是一个坏主意。根据您想要实现的目标,有一种更好的方法来处理事情。