我知道当应用程序池被回收时,会启动一个新的工作进程,但我对在此过程中如何处理过期和有效会话感到困惑?传递给新的工作进程线程哪些被淘汰?它会做什么:
回收后,当用户A和用户B要求他们的会话状态是什么时?
答案 0 :(得分:13)
如果您有一个网络服务器,并且您已使用默认的InProc
模式进行SessionState持久性,那么您已添加到会话的字典中的所有数据服务器代码将在应用程序池回收期间丢失 - 在回收后,当您的代码接下来访问SessionState
字典中的条目时,它将返回null
。
如果您在负载均衡器上有多个Web服务器,会话状态错误地配置为InProc
,并且用户返回到其他服务器(即没有粘性路由),则会发生这种情况。
(存储在浏览器上的会话状态cookie可能仍有效几分钟。)
允许会话状态生存的方式'应用程序池回收,服务器崩溃或跨越服务器场是为了保存SessionState
中存储的数据,以便服务器(或多个服务器)可以在用户的会话返回时再次检索数据。最简单的方法是使用out of the box解决方案之一,即单独的StateServer
进程,或在SqlServer
数据库中存储状态。自定义持久性也是一种选择。
有一点需要注意 - 您存储在“流程外”的任何数据。 StateServer
或SqlServer
等模式需要序列化 - 当您切换出InProc
时,这可能会发生重大变化。