c# - .Net 奇怪的 session 错误 - 由于新 session 在回发期间变量消失

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

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

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

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

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

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

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

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

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

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

干杯, 托尼

更新:

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

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

显然要么锁定(我们在日志或事件监视器中看不到)要么删除仍然有效的 session 。

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

最佳答案

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

关于c# - .Net 奇怪的 session 错误 - 由于新 session 在回发期间变量消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875746/

相关文章:

c# - 计算 linq 查询中的总计

c# - ASP.NET + C# 的最佳资源是什么?

javascript - 代码隐藏未检测到 JavaScript 中更改的显示

sql-server - SSIS解决方案中的杂项文件夹有什么用

javascript - 将值插入 SQL 本地数据库并使用 Javascript 打印表数据

c# - MVC 4 和 Google Charts - 如何将折线图的数据从 Controller 传递到 View ?

c# - 如何在抽象类的静态属性中使用 HttpContext.Current.Session。?

c# - 如何在 asp :Repeater? 中改变我的 ItemTemplate

asp.net - 使用 HtppWebRequest 发布的表单数据无效

SQL Server 过程/函数将表复制到另一个数据库