间歇性地返回不正确的 ASP.NET 会话数据

间歇性地返回不正确的 ASP.NET 会话数据

我接到一个任务,要调查一个问题,即用户会话在页面刷新之间发生变化。我立即(对网站一无所知)说这似乎是负载平衡/Web 集群配置问题。然而,我后来发现该网站没有负载平衡——它是一台单服务器。

应用程序有一个存储在 Session 中的 Basket 对象。用户将商品添加到篮子等。在篮子页面上,如果刷新页面,篮子中的商品会发生变化,有时甚至没有。

会话不会丢失,它几乎总是在下次刷新时恢复,但购物篮可能为空,或者在下次刷新时有不同的内容。我以前多次见过这种行为,但仅限于多服务器设置。

我们曾尝试在开发环境中复制此问题,但没有成功 - 我们根本无法复制该问题,但在现场它经常发生。

该 Web 应用程序是一个 ASP.NET WebForms 站点,在 Windows Server 2008 R2 和 IIS 7.5 上的 .NET 4.0 下运行。

会话状态模式为InProc,会话超时设置为480分钟。

我使用 fiddler 查看了请求和响应,每次传递给服务器的 ASP.NET 会话 ID 都是相同的。除了实际返回的 HTML 之外,响应之间似乎没有任何区别。

有谁知道什么可能导致这个问题吗?

更新 1:

我重新编写了同事在购物篮代码中实现的一些日志记录。现在我可以看到,尽管显示的数据不同,但 Session ID 保持不变,Session 变量的值也保持不变。

抱歉,我应该在发布此内容之前检查一下他们的日志。

尽管我确信这是一个服务器问题,但代码在我们的测试环境中按预期运行。

答案1

“我说这似乎是负载平衡/Web 集群配置问题。但是,我后来发现该网站没有负载平衡 - 它是一台单服务器。”

仅因为它是一台服务器并不意味着没有负载平衡。IIS 中有一个称为“Web Garden”的功能,它将 Web 工作拆分到多个进程中,以便可以将其分布在多个 CPU 上。

它就像一个小型的“网络农场”——因此得名“网络花园”。:)

使用 Web Garden 的一个影响是它使 InProc 会话变量无法正常工作,因为您可能最终会在每个页面请求中使用不同的工作进程。InProc(In Process)只有在您始终最终在同一个进程中

解决方案 1:

  • 确保 IIS 未设置为使用 Web Garden。具体操作如下:
    1. 打开 IIS 管理器。
    2. 确定您的 Web 应用程序正在使用哪个应用程序池。
    3. 右键单击您的应用程序池并选择“高级属性“。
    4. 向下滚动并设置“最大工作进程数“ 到1

应用程序池设置

解决方案 2:

查看此 MSDN 博客:进程内会话状态管理

它描述了您的会话状态选项,以及如何解决 InProc 会话丢失问题。

答案2

我已经很久没有修改过代码了(最后修改时间:2016年7月20日)

但是我在 Windows Server 2016 中也遇到了同样的问题。我的客户将 Windows 2012 R2 升级到 Windows 2016。我无法解决这个问题。

然后我降级到旧服务器(Windows 2012 R2)。我的问题解决了。我认为这是一个错误,但我不能确定

也许它会对你有帮助。

相关内容