ASP.NET会话意外放弃

时间:2011-02-15 20:06:33

标签: c# .net asp.net session data-loss

出于某种原因,会议正在意外地放弃,并在我们的应用程序中造成严重破坏。我们已经让应用程序设置使用Session并且已经使用它几个月而没有任何问题。现在,当我们添加其他内容并在其中存储其他信息时,会话在20分钟超时之前就会比预期更好。我之所以感到茫然......可能是因为我们可能会在Session中添加大量数据(不确定确切的大小)?毕竟这是我的本地机器(Win 7,使用IIS,ASP.NET 4.0,4 GB RAM)。

或者可能有其他原因发生这种情况?有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

ASP.Net会话存储在缓存中。如果你的内存不足,那么它将被转储。您需要将会话存储在数据库或其他存储中以保留它。我会尝试找到相关的链接。会话并不意味着存储大量数据!

以下是解释如何使用out-of-process sessions的链接。基本上,这个想法是,默认情况下,ASP.Net/IIS将使用进程内会话(速度最快),但也受运行IIS的服务器上的电源/存储的限制。替代方法是使用会话状态服务器场或SQL服务器来存储会话。这些有点慢,但提供更多的灵活性。您需要考虑将会话序列化为您的决定的能力。


以下是我读过的一本书的摘录(由Dino Esposito编写的Microsoft ASP.NET 3.5):

为什么我的会话状态有时会丢失?

  

当工作模式为InProc时,会话状态将映射到正在为其提供页面请求的AppDomain的内存空间中。鉴于此,会话状态受进程回收和AppDomain重新启动的影响。正如我们在第2章中讨论的那样,ASP.NET工作进程会定期重新启动,以保持平均良好的性能;发生这种情况时,会话状态将丢失。进程回收取决于内存消耗的百分比以及可能的服务请求数。尽管该过程是循环的,但是不能对循环的间隔进行一般考虑。在设计基于会话的进程内应用程序时要注意这一点。作为一般规则,请记住,当您尝试访问它时,会话状态可能不存在。根据您的应用使用异常处理或恢复技术。

     

在知识库文章Q316148中,Microsoft建议某些防病毒软件可能将web.config或global.asax文件标记为已修改,从而导致启动新应用程序并随后导致会话状态丢失。如果您或您的代码修改这些文件的时间戳,也是如此。此外,Bin目录中的任何添加或删除都会导致应用程序重新启动。

     

注意:当正在运行的页面遇到错误时,会话状态会发生什么变化?当前字典会被保存还是只丢失了?如果在请求结束时页面导致错误(即Server对象的GetLastError方法返回异常),则不会保存会话状态。但是,如果在异常处理程序中通过调用Server.ClearError重置错误状态,则会定期保存会话的值,就好像没有发生错误一样。

答案 1 :(得分:1)

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

此外,如果您在给定网站上更改数据,那么它最终会触发应用程序池回收。

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