【问题标题】:ASP.NET Session identifierASP.NET 会话标识符
【发布时间】:2010-12-14 14:31:44
【问题描述】:

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

请在这方面提供任何帮助。

【问题讨论】:

  • 您是否有任何代码可以根据您的请求实际访问会话?
  • 顺便说一句,你为什么不同意这个? msdn.microsoft.com/en-us/library/…
  • 你想达到什么目的?会话已经有一个 id:SessionID...
  • @Restuta, @Yves M. - SessonID 并不像我希望的那样简单易读。
  • 但它有效 =) 谁需要 Session ID 的可读性?

标签: asp.net session global-asax


【解决方案1】:

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

【讨论】:

  • 谢谢,这实际上是正在发生的事情。我已经实现了@rdkleine 解决方案(将 codSesion 保存在文件中),现在它可以工作了
【解决方案2】:

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

您可以尝试使用 SqlServer 来存储 Session,如此处所述,以便数据被持久化:

MSDN - ASP.NET Session State

即使这样可行,尝试以这种方式使用 Session 也是一个坏主意。根据您要达到的目标,有更好的处理方式。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 2017-10-09
      • 2014-01-01
      • 1970-01-01
      • 2010-10-17
      • 2016-03-12
      • 2011-01-30
      相关资源
      最近更新 更多