ASP.Net 会话存储在缓存中。如果您的内存不足,那么它将被转储。您需要将会话存储在数据库或其他存储中以保留它。我会尝试找到一个相关的链接。会话并不意味着存储大量数据!
这是一个解释如何使用进程外会话的链接。基本上这个想法是,默认情况下,ASP.Net/IIS 将使用进程内会话(这是最快的),但也受到运行 IIS 的服务器上的电源/存储的限制。替代方法是使用会话状态场或 SQL 服务器来存储会话。这些速度有点慢,但提供了更大的灵活性。您需要考虑将会话序列化为您的决定的能力。
这是我一直在阅读的一本书的摘录(Dino Esposito 编写的《Programming Microsoft ASP.NET 3.5》):
为什么我的会话状态有时会丢失?
当工作模式为 InProc 时,会话状态映射到正在处理页面请求的 AppDomain 的内存空间中。鉴于此,会话状态受到进程回收和 AppDomain 重启的影响。正如我们在第 2 章中所讨论的,ASP.NET 工作进程会定期重新启动以保持平均良好的性能;发生这种情况时,会话状态将丢失。进程回收取决于内存消耗的百分比,也可能取决于服务的请求数。尽管该过程是循环的,但不能对循环的间隔进行一般考虑。在设计基于会话的进程内应用程序时要注意这一点。作为一般规则,请记住,当您尝试访问会话状态时,它可能不存在。
在知识库文章 Q316148 中,Microsoft 建议某些防病毒软件可能会将 web.config 或 global.asax 文件标记为已修改,从而导致启动新应用程序并随后导致会话状态丢失。如果您或您的代码修改这些文件的时间戳,这也适用。此外,对 Bin 目录的任何添加或删除都会导致应用程序重新启动。
注意:当正在运行的页面遇到错误时,会话状态会发生什么?当前字典会被保存还是只是丢失了?如果在请求结束时页面导致错误,则不会保存会话状态——即,Server 对象的 GetLastError 方法返回异常。但是,如果在您的异常处理程序中通过调用 Server.ClearError 重置错误状态,则会话的值会定期保存,就好像从未发生过错误一样。