丢失我的会话变量 - 什么异常可能导致会话丢失?

时间:2010-10-01 14:04:57

标签: asp.net asp.net-4.0

我在生产系统上启用了运行状况监控(asp.net webforms .net 4),我发现有很多错误发送给我,表明会话变量已丢失。

(我试图将会话状态中的内容附加到实体框架数据上下文并获取“值不能为空,参数名称实体”错误)。所以会话变量现在包含null而不是对象。

有趣的是,我们在两个独立的服务器上部署了相同的应用程序 - 一个用于外部用户的DMZ服务器和一个用于内部用户的内部服务器。两个不同服务器上的这两个应用程序似乎都有同样的问题。

Health Monitoring也监控生命周期事件,我可以从中看到我们没有像IIS回收,配置更改,bin文件夹更改,重新编译等那样的事情。

我已阅读此页:http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx

我可以确认它不是Response.Redirect问题因为没有发生 - 这是一个在线申请表 - 它在page_load上将对象置于会话状态并且有一个多视图 - 当按下“next”时,对象到来超出会话状态,附加到数据上下文,更改从Web表单和datacontext更新。所以没有回应。直接发生。

我还可以确认该链接中“Update 1”和“Update 2”中的详细信息与我无关 - 应用程序池中只有1个工作进程在运行,并且服务器名称或Web地址不包含下划线

我还说过发生会话超时的可能性,但是它们应该由正在运行以检测会话超时的其他代码处理(参见:http://blogs.msdn.com/b/nikhiln/archive/2007/06/21/detecting-session-timeout-in-asp-net-2-0-web-applications.aspx)我已经反复测试过 - 部分问题是我只是不能自己重现这个错误。

所以: -
- 没有超时
- 不是IIS工作进程回收或任何其他会产生健康监视生命周期事件的事情 - 不使用response.redirect
- 没有网络农场/多个工作进程

然后我找到了这个帖子:http://bytes.com/topic/asp-net/answers/490975-disappearing-sessions MVP说了以下内容:

  

IIS应用程序的任何时候   重新启动,所有会话都重新启动   太。所以是的,这通常会   在重新编译期间发生和一些   主要未处理的应用程序级别   异常。

但遗憾的是没有详细说明什么样的“未处理的主要应用程序级异常”可能导致会话丢失 - 这是一个全新的系统,我们仍然有未处理的exeptions我们正在努力修复 - 所以什么样的我们在这里讨论的例外吗?一个人会话中的应用程序异常是否真的会删除应用程序持有的所有会话?

这个帖子也触及它:http://bytes.com/topic/asp-net/answers/490975-disappearing-sessions

  

我见过的唯一一件事就是   当发生运行时错误时   ASP.NET应用程序,导致   应用程序重启。你是   接收Application_OnStart事件   太?

所以我猜我是否有一个导致应用程序重启的运行时错误,这也会产生健康监控生命周期事件,对吧?我只是没有得到任何......

如果我能真正重复这一点会更容易,但我不能!

无论如何,对于一个长期的混乱问题感到抱歉,只希望有人有一些想法。

此致

1 个答案:

答案 0 :(得分:1)

您是否考虑将会话状态置于应用之外,例如与任何asp.net out-of-process modes for session state

默认情况下,会话状态在您的应用内维护。它不能跨多个服务器使用,也不能跨应用程序崩溃进行维护(即应用程序中的任何未处理的异常。)

  1. 使用SQL Server模式在多个服务器上提供相同的会话状态。

  2. 或者,如果您的负载均衡器保证了强大的会话亲和力,您可以使用asp.net状态服务器来管理每个服务器中的状态,使状态能够在应用程序重新启动后继续运行。