C# .Net怪异会话错误-在回发过程中由于新会话而导致变量消失

C# .Net怪异会话错误-在回发过程中由于新会话而导致变量消失,c#,asp.net,sql-server,session,session-state,C#,Asp.net,Sql Server,Session,Session State,我有一个非常非常奇怪的问题,我希望有人能解释一下。我们有一个表单一直在给我们带来问题,通过调试等,我们意识到这是由于“随机”消失的会话变量造成的 我们知道这不是代码做的,所以为了消除这个问题,我们设计了一个非常简单的表单,其中包含一个文本和一个按钮。在页面加载过程中,若不是回发,它会设置一个会话变量,比如带有日期和时间的“myvalue”。当用户单击按钮时,它会检查会话中是否存在该变量,然后显示该变量是否存在。然后它将放弃会话,以便清除下一次运行(它不会以我上面描述的形式执行此操作-这只是为了测

我有一个非常非常奇怪的问题,我希望有人能解释一下。我们有一个表单一直在给我们带来问题,通过调试等,我们意识到这是由于“随机”消失的会话变量造成的

我们知道这不是代码做的,所以为了消除这个问题,我们设计了一个非常简单的表单,其中包含一个文本和一个按钮。在页面加载过程中,若不是回发,它会设置一个会话变量,比如带有日期和时间的“myvalue”。当用户单击按钮时,它会检查会话中是否存在该变量,然后显示该变量是否存在。然后它将放弃会话,以便清除下一次运行(它不会以我上面描述的形式执行此操作-这只是为了测试)

然而,100次中有90次(为了争论起见),它会像你期望的那样。然而,对于这10个变量,在整个测试中随机分布-因此没有特定的时间间隔或测试重复-它将报告变量已经消失

现在我已经确认这是100%由于会话以完全随机的间隔重新启动。在第一个页面加载时,它声明IsNewSession是真的——这是我第一次看到它时所期望的。在回发时,它被设置为IsNewSession=false——这也是我所期望的,并且启动变量已经就位

但是,当它出错时,初始请求IsNewSession为true,但在回发时,它再次设置为true—存储中没有变量

环境正在使用AspState数据库(SQL Server)。没有明显的事情发生,更糟糕的是问题的随机性。超时几乎被消除。唯一的区别是,这是在跨4台服务器的负载平衡环境中进行的。我们已经检查了IIS(7.5)中的应用程序ID,它们都是相同的机器密钥等

有人知道这里发生了什么吗?这是.NET2BTW,这可能是问题所在-我希望这是这个版本的状态管理的一个已知问题,但到目前为止,我还没有找到任何可能的原因

在一台服务器上使用InProc时,问题似乎没有出现。这似乎只有在使用Sql Server时才会发生

提前感谢-非常感谢您的帮助

干杯, 托尼

更新:

我们认为我们已经解决了这个问题。存储过程DeleteExpiredSessions每分钟运行一次,这是microsoft在其KB文章中推荐的修改版本。这是每分钟运行一次的,所以我们在测试中复制了它(这也是负载平衡的),并将作业设置为在相同的时间间隔上运行

测试中也发生了同样的情况。通过在live中禁用此功能,问题现已消失

很明显,这要么是锁定(我们无法在日志或活动监视器中看到),要么是删除仍然有效的会话


以前有人见过这个吗?我目前的理论是,每次对您登录的服务器进行调用时,会话都会被初始化,但无论出于何种原因,会话都会被认为是“无效”的并被回收。

这只是一个猜测,但请检查服务器上的系统时钟,确保它们是同步的,并且处于完全相同的时区(包括DST设置)。

我想我会发布一个(早该发布的)更新-根据我上面的更新,最终肯定是存储过程导致了问题。如果您遇到了相同的问题,我建议完全禁用它进行验证-但它确实为我们带来了好处