1

由于某种原因,会话意外地放弃了,并对我们的应用程序造成了严重破坏。我们已经设置了使用 Session 的应用程序,并且已经使用了几个月没有任何问题。现在,当我们添加额外的内容并在其中存储额外的信息时,会话在 20 分钟超时之前转储的时间比预期的要早。我不知道为什么......可能是因为我们可能会在 Session 中添加大量数据(不确定确切大小)?毕竟这是我的本地机器(Win 7,使用 IIS,ASP.NET 4.0,4 GB RAM)。

或者还有其他原因导致这种情况发生吗?有什么想法吗?

谢谢。

4

2 回答 2

2

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 重置错误状态,则会话的值会定期保存,就好像从未发生过错误一样。

于 2011-02-15T20:16:28.630 回答
1

我假设您正在使用进程中的会话状态。如果是这种情况,那么丢失会话的最常见原因是相应的应用程序池回收。去检查应用程序池上的 IIS 设置并为此类事件设置事件日志条目。您将在以下位置找到设置:应用程序池的“高级设置” -> “回收” -> “生成回收事件日志条目”。将它们全部设置为 true,看看它是否会给您提供会话状态丢失的原因。

此外,如果您大量更改给定站点上的数据,则最终会触发应用程序池回收。

有关应用程序池回收的更多想法:http:
//blogs.msdn.com/b/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

于 2011-02-15T20:25:16.653 回答