我接到一个任务,要调查一个问题,即用户会话在页面刷新之间发生变化。我立即(对网站一无所知)说这似乎是负载平衡/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。具体操作如下:
- 打开 IIS 管理器。
- 确定您的 Web 应用程序正在使用哪个应用程序池。
- 右键单击您的应用程序池并选择“高级属性“。
- 向下滚动并设置“最大工作进程数“ 到
1
。
解决方案 2:
- 使用会话状态服务器,其唯一任务是管理所有工作进程的会话状态。
- 然后将 Web 应用程序从 InProc 更改为 StateServer。
- 查看配置状态服务器以维护会话状态 (IIS 7)开始做这件事。:)
查看此 MSDN 博客:进程内会话状态管理
它描述了您的会话状态选项,以及如何解决 InProc 会话丢失问题。
答案2
我已经很久没有修改过代码了(最后修改时间:2016年7月20日)
但是我在 Windows Server 2016 中也遇到了同样的问题。我的客户将 Windows 2012 R2 升级到 Windows 2016。我无法解决这个问题。
然后我降级到旧服务器(Windows 2012 R2)。我的问题解决了。我认为这是一个错误,但我不能确定
也许它会对你有帮助。