9

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

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

但是,100 次中有 90 次(为了论证),它会按照您的预期运行。但是对于这 10 个,随机分布在整个测试中 - 因此没有特定的时间间隔或测试重复 - 它会报告变量已经消失。

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

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

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

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

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

在此先感谢 - 非常感谢任何帮助,

干杯,托尼

更新:

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

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

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

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

4

2 回答 2

1

以为我会发布一个(过期已久的)更新 - 根据我上面的更新,这绝对是最终导致问题的存储过程。如果您遇到同样的问题,我建议您完全禁用它来验证 - 但它确实对我们有用。

于 2015-07-16T19:00:07.710 回答
0

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

于 2013-09-23T22:13:04.367 回答