我知道何时回收应用程序池时会启动一个新的工作进程,但是我对在此过程中如何处理过期和有效的 session 感到困惑?哪些传递给新的工作进程线程,哪些被消除?它会做什么:
回收后,当用户A和用户B请求时,他们的 session 状态是什么?
最佳答案
如果您只有一台Web服务器,并且已使用默认的InProc
模式进行SessionState持久化,则在应用程序池回收期间,您在服务器代码中添加到 session 的Dictionary中的所有数据都会丢失-回收后,当您的代码下一次访问SessionState
字典中的条目时,它将返回null
。
如果您在负载平衡器上有多个Web服务器,并且 session 状态错误地配置为InProc
,并且用户返回到其他服务器(即,没有粘性路由),则也会类似地发生。
(存储在浏览器中的 session 状态cookie可能仍在几分钟内有效)。
允许 session 状态“生存”一个应用程序池回收,服务器崩溃或跨服务器场的方法是持久存储存储在SessionState
中的数据,以便该服务器(或多个服务器)可以在用户的状态下再次检索数据。 session 返回。最简单的方法是使用out of the box解决方案之一,即使用单独的StateServer
进程,或将状态存储在SqlServer
数据库中。自定义持久性也是一种选择。
需要注意的是-请注意,以“进程外”模式存储的任何数据(例如StateServer
或SqlServer
)都需要可序列化-当您退出InProc
时,这可能是一项重大更改。
关于asp.net - 应用程序池回收如何影响ASP Net Session State?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34544760/