我已经被赋予了查看用户的会话在刷新页面之间改变的问题的任务。 立即(不知道任何关于网站)我说,这似乎是一个负载平衡/networking群集configuration问题。 不过,后来我发现网站不是负载平衡的 – 这是一个单一的服务器。
应用程序有一个存储在Session中的Basket对象。 用户将物品添加到篮子等。当在篮子页面上时,如果页面被刷新,则篮子中的物品改变,并且有时没有物品。
会话没有丢失,它几乎总是在下一次刷新,但是篮子可以是空的或者在下一次刷新时具有不同的内容。 我在很多时候就已经看到了这种行为,但只在多服务器设置上才有。
这是我们试图在开发环境中复制而没有成功的事情 – 我们根本无法复制问题,但在现场发生了很多事情。
Web应用程序是一个ASP.NET WebForms站点,在Windows Server 2008 R2和IIS 7.5上运行在.NET 4.0下。
会话状态模式是InProc,会话超时设置为480分钟。
我用小提琴来查看请求和响应,并且每次传递给服务器的ASP.NET会话ID都是一样的。 除了返回的实际HTML之外,似乎没有区别。
有没有人有什么可能会导致这个问题的想法?
更新1:
我已经重新编写了一个同事在篮子代码中执行的一些日志logging。 现在我可以看到会话ID保持不变,即使显示不同的数据,Sessionvariables的值也保持不变。
对不起,我应该在发布之前检查他们的日志。
我确信这是一个服务器问题,但代码在我们的testing环境中按预期工作。
“我说,这似乎是一个负载平衡/networking集群configuration问题。但是,后来我发现,网站不是负载平衡 – 这是一个单一的服务器。
仅仅因为它是一台服务器并不意味着没有进行负载平衡。 IIS中有一个称为“Web Garden”的function,它将Web工作分成多个进程,以便可以跨多个CPU进行分布。
这就像一个小的“networking农场”,因此被称为“networking花园”。 🙂
使用Web Garden时的一个影响是它使InProc会话variables停止正常工作,因为您可能最终在每个页面请求的不同工作进程中。 InProc(进程中)只有在最终进入同一进程时才能可靠运行。
解决scheme1:
1 。 
解决scheme2:
看看这个MSDN博客: 进程中的会话状态pipe理
它描述您的会话状态选项,以及如何解决InProc会话丢失问题。
我很长一段时间没有更改代码(最后更改:2016年7月20日)
但我也有同样的问题在Windows Server 2016.我的客户是升级到Windows 2016的Windows 2012 R2我无法解决这个问题。
然后我降级到旧的服务器(Windows 2012 R2)。 我的问题解决了。 我认为这是一个错误,但我无法确定
也许它会帮助你。