如果会话超时,global.asax中的session_start会发生什么?

时间:2011-02-01 00:22:40

标签: session timeout global-asax

我有多域网络应用程序,根据用户使用的URL对用户进行不同的处理。

我正在使用Session [“data”]来保存有关用户的信息,并在Global.asax中使用Session_Start [“data”]开始此会话。

一切正常,但我想知道不活动后会发生什么。一段时间后会话将超时。如果发生这种情况,Global.asax将此视为新用户,并将再次为此用户启动Session_Start?

会话[“数据”]会在每次加载/重新加载时更新吗?或者因为它只启动一次并在某个确切时间内超时?

我试图让这个问题尽可能清楚。

感谢。

3 个答案:

答案 0 :(得分:3)

每次服务器被该用户命中时,Session都会更新/保持活动状态。您在Web配置文件中设置超时,它是一个滑动值,因此每次有服务器请求时它都会重新启动。

类似的东西:

<configuration>
  <sessionstate 
      mode="inproc"
      cookieless="false" 
      timeout="20" />
</configuration>

当会话超时时,下次有请求时,Session_Start将执行。如果从代码中的任何其他位置访问Session [data],则应检查以确保它不为null,因为如果会话超时并且您尝试访问它,它将抛出NullReferenceException。

答案 1 :(得分:2)

当用户首次访问您网站上的.NET URL(如.aspx页面,但不是.html或其他静态文件)时,会启动新会话。该会话持续到超时或应用程序被终止(重新启动/崩溃/回收)。默认的.NET超时为20分钟;因此,只要用户持续点击.aspx页面并且没有超过20分钟的休息时间,会话就会持续。

在此期间,您可以将信息存储在与该用户相关的Session对象中。它本质上是一个哈希表,您可以使用为其定义键的对象填充它。在您的情况下,您正在使用Session [“data”],但您可以使用任何您想要的密钥。

然而,会话以及存储在Session哈希表中的数据非常脆弱(请参阅上面的所有方法)。你不应该依赖它来保存任何不能轻易重建的东西(例如在Session_Start中)。所以它确实有两个作用:维护状态(所以你知道它在页面之间仍然是同一个用户);并且作为用户特定的缓存,您可以将数据保存在内存中以便更快地完成任务。

根据定义,

Session_Start每个会话只运行一次。如果您需要在多个会话中识别单个用户,则需要使用更永久的内容,例如设置您自己的cookie以及远期到期。您可以在这样的cookie中放置一个ID,让您知道这是用户12345(实际上,Session_Start只是查找“永久”cookie的地方,并通过此新会话连接有关该现有用户的数据)。

如果你想存储关于在多个会话中存活的用户的数据,你将不得不存储更永久的地方 - 数据库是最明显的解决方案。当他们回来时,你可以在Session哈希表中缓存一些数据 - 而Session_Start也是这样做的地方。希望这会有所帮助。

答案 2 :(得分:0)

protected void Session_Start(object sender,EventArgs e)     {         //启动新会话时运行的代码

    string RootURL = Request.ApplicationPath;
    if (!RootURL.EndsWith("/"))
        RootURL += "/";
    Globals._rootURL = RootURL;
}