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 ServerState Server 将会话存储在单独的机器上,那么当应用程序被拆除时,会话可以继续存在。然后由于客户端在浏览器中保留了原始会话 cookie,下次他们访问该站点时会话会重新启动,并且sessionid 用于标识他们现有的会话。

【讨论】:

我正在寻找另一个方向的场景。如果应用程序终止(例如通过重新启动 IIS 或进程回收等)会发生什么情况,会话是否仍处于活动状态? 好吧,如果您将会话存储在数据库或状态服务器中,那么是的,客户端仍然会有会话 cookie。所以下次他们访问并且应用程序启动时,他们的会话可以重新启动(因为会话数据仍然针对 sessionid 持续存在)。 嗯,谢谢。我试图将有关会话的一些信息保存到应用程序(静态变量)中。但看起来我们不能保证静态变量总是对每个活动会话都有价值。这很可悲:( 当应用程序结束时,静态数据会丢失。这是个坏主意。【参考方案2】:

是的,当您将状态放入 SQL Server 时,应用程序可能会重新启动,但您仍将保持会话状态

【讨论】:

以上是关于ASP.NET 会话的寿命是不是比应用程序长的主要内容,如果未能解决你的问题,请参考以下文章

通过 IIS ARR 的客户端关联/粘性会话是不是适用于 ASP.NET Core 3+/.NET 5?

ASP.NET 中的会话超时

C++程序员的职业寿命比Java长?Java程序员同意吗?

如何防止asp.net应用程序会话劫持?

使用 ASP.NET 会话状态服务跨应用程序共享会话

电话间隙 HTML 应用程序可以与 asp.net Mvc Web 服务器建立会话吗