2011-02-01 43 views
2

我有多域Web应用程序,它根据用户使用的URL来区别对待用户。如果会话超时,global.asax中的session_start会发生什么情况?

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

所有的工作都很好,但我想知道在不活动后会发生什么。经过一定的时间后会超时。如果发生这种情况,Global.asax会将其视为新用户并将再次为此用户启动Session_Start?

并且Session [“data”]会随每次页面加载/重新加载而更新吗?或者因为它只启动一次,并在某个确切的时间超时?

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

谢谢。

回答

3

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

是这样的:

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

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

+1

因此,如果用户保持活跃,直到然后用户停止使用应用程序的session_start将开始一次运行? – feronovak 2011-02-01 00:28:38

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也是这样做的地方。希望这可以帮助。

0

保护无效在session_start(对象发件人,EventArgs的){ // 代码,当一个新的会话启动

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