asp.net 使用了“Session State 服务”或者使用 SQL Server 来持久化 asp.net 进程状态。当然这都要付出巨大的代价,所以这并不是默认的 InProc 模式。
默认模式下,设计开发 asp.net 程序就不应该随便使用 Session 集合。这个应该从一开始就学到。你可以基于 SessionID 和 Cache 来管理缓存对象,然后当缓存对象不存在时(需要重建时)才去读取数据库。
InProc 模式下的 Session 值本来就是随时可能会丢失的,有无数种情况会让 asp.net 进程重启,不仅仅是修改配置文件,你随便修改一下 bin 下的文件、或者更改除了 app_data 以外的目录,服务器管理者设置了多长时间、多少IIS连接数、物理内存用到多少比例、CPU占用多少比例就自动回收一次应用程序池,你的 asp.net 程序遇到一个 BUG,等等情况,都会造成进程重启。重启是 asp.net 和 IIS 自我恢复的自动机制。
编写 asp.net 程序的时候就应该避免使用 Session。只有 SessionID 是不会丢失的,而 Session 集合内容本来就是随时丢失的(注意是丢失,不是过期),这个是 asp.net 开发常识知识应该在开发之前就了解。