ASP.NET 会话的寿命是不是比应用程序长
Posted
技术标签:
【中文标题】ASP.NET 会话的寿命是不是比应用程序长【英文标题】:Can ASP.NET session live longer than ApplicationASP.NET 会话的寿命是否比应用程序长 【发布时间】:2011-11-12 13:45:33 【问题描述】:这可能是一个愚蠢/蹩脚的问题,尤其是在使用 ASP.NET 这么长时间之后:),但我需要确定一下。
是否可以让会话(即 ASP.NET 会话)比应用程序(应用程序实例/应用程序域/应用程序变量)寿命更长?
也就是说,如果在 Global.asax 中调用了 Application_End,是否表示将不再有活动会话?并且任何新请求都会导致 Application_Start 后跟新的 Session_Start?
注意,Session 可能并不总是 InProc,会话可能在 State server 或 SQL server 中。
【问题讨论】:
【参考方案1】:使用默认的InProc
会话状态,应用程序将在最后一个会话到期时终止,此时Application_End
发生。在这种情况下,整个appDomain
被拆除并释放所有内存。由于会话在内存中持久存在,因此它们在此时被永久销毁,因此永远不会超过应用程序的生命周期。
如果使用Sql Server
或State Server
将会话存储在单独的机器上,那么当应用程序被拆除时,会话可以继续存在。然后由于客户端在浏览器中保留了原始会话 cookie,下次他们访问该站点时会话会重新启动,并且sessionid
用于标识他们现有的会话。
【讨论】:
我正在寻找另一个方向的场景。如果应用程序终止(例如通过重新启动 IIS 或进程回收等)会发生什么情况,会话是否仍处于活动状态? 好吧,如果您将会话存储在数据库或状态服务器中,那么是的,客户端仍然会有会话 cookie。所以下次他们访问并且应用程序启动时,他们的会话可以重新启动(因为会话数据仍然针对 sessionid 持续存在)。 嗯,谢谢。我试图将有关会话的一些信息保存到应用程序(静态变量)中。但看起来我们不能保证静态变量总是对每个活动会话都有价值。这很可悲:( 当应用程序结束时,静态数据会丢失。这是个坏主意。【参考方案2】:是的,当您将状态放入 SQL Server 时,应用程序可能会重新启动,但您仍将保持会话状态
【讨论】:
以上是关于ASP.NET 会话的寿命是不是比应用程序长的主要内容,如果未能解决你的问题,请参考以下文章