.Net奇怪的会话错误 - 由于回发期间的新会话而变量消失

时间:2013-09-18 15:00:25

标签: c# asp.net sql-server session session-state

我有一个非常非常奇怪的问题,我希望有人可以解释一下。我们有一个导致我们出现问题的表单,并且通过调试等实现它是由于会话变量“随机”消失。

我们知道这不是代码所做的 - 所以为了消除这个,我们用一个文字和一个按钮敲了一个非常简单的表格。在页面加载期间,如果它不是回发,则设置会话变量,用日期和时间说“myvalue”。当用户单击该按钮时,它会检查该变量的会话,然后显示它是否存在。然后它将放弃会话,以便下一次运行将被清除(它不会以我上面描述的形式执行此操作 - 这仅用于测试)。

然而,100次中有90次(为了论证),它将按照您的预期行事。然而,对于那些10,随机分布在测试中 - 所以没有特定的时间过去或测试重复 - 它会报告变量已经消失。

现在我已经确认这是100%,因为会话以完全随机的间隔重新启动。在第一页加载时,它声明IsNewSession为真 - 这是我第一次进入的预期。在回发时,它被设置为IsNewSession = false - 再次是我所期望的,并且引导我的变量是的地方。

然而,当它出错时,初始请求IsNewSession为true,但在回发时它再次设置为true - 商店中没有变量。

环境正在使用AspState数据库(SQL Server)。没有什么明显的事情 - 更糟糕的是问题的随机性。几乎消除了超时。唯一的区别是,这是在4台服务器上的LOAD BALANCED环境中。我们检查了IIS(7.5)中的应用程序ID,它们都是相同的 - 相同的机器密钥等。

有谁知道这里发生了什么?这是.Net 2顺便说一下,这可能是问题 - 我希望这个版本的状态管理是一个已知的问题,但到目前为止我找不到任何可能指出原因的东西。

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

提前致谢 - 非常感谢任何帮助,

干杯, 贝

更新

我们认为我们已经解决了这个问题。存储过程DeleteExpiredSessions每分钟运行一次 - 这是微软在其文章http://support.microsoft.com/kb/973849中推荐的改编版本。这是每分钟都在运行 - 所以我们在测试中复制了它(也是负载平衡的)并将作业设置为在相同的时间间隔内运行。

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

显然要么锁定(我们在日志或活动监视器中看不到),要么删除仍然有效的会话。

有没有人见过这个?我目前的理论是会话在每次调用您登陆的服务器时初始化,然后在回发重定向到另一台服务器,无论出于何种原因会话被认为是“无效”并被回收。

2 个答案:

答案 0 :(得分:1)

以为我发布了一个(姗姗来迟)更新 - 根据我上面的更新,它绝对是导致问题的存储过程。如果你遇到同样的问题我建议完全禁用它来验证 - 但它确实为我们做了诀窍。

答案 1 :(得分:0)

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