ASP.NET会话标识符

时间:2010-12-14 14:31:45

标签: asp.net session global-asax

我正在尝试为我网站上的每个客户端创建一个会话代码。在全局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中)。

请相信我对此有任何帮助。

3 个答案:

答案 0 :(得分:3)

我不确定这是否解释了您在上面列出的所有行为,但默认情况下,IIS中的应用程序池将在一段时间不活动后进行回收(可以在IIS中为每个应用程序池更改这​​些设置)。当应用程序池循环使用时,池的新实例将完全重新初始化。

答案 1 :(得分:2)

IIS回收工作进程,你将失去codSession的静态值。

将信息保存在文件或数据库中以克服此问题。

答案 2 :(得分:2)

在一段时间不活动后,IIS将停止您的应用程序。一旦有人访问,该网站将重新开始。将其与您正在使用In Processes Session State的事实相结合,这就是您看到值重置的原因。

您可以尝试使用SqlServer存储此处描述的Session,以便持久保存数据:

MSDN - ASP.NET Session State

即使这样可行,尝试以这种方式使用Session也是一个坏主意。根据您想要实现的目标,有一种更好的方法来处理事情。