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

我已经被赋予了查看用户的会话在刷新页面之间改变的问题的任务。 立即(不知道任何关于网站)我说,这似乎是一个负载平衡/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:

  • 确保IIS没有设置为使用Web Garden。 去做这个:
    1. 打开IISpipe理器。
    2. 确定您的Web应用程序正在使用哪个应用程序池。
    3. 右键单击您的应用程序池并select“ 高级属性 ”。
    4. 向下滚动并将“ 最大工作者进程 ”设置为1

应用程序池设置

解决scheme2:

  • 使用会话状态服务器,其唯一任务是pipe理所有工作进程的会话状态。
  • 然后将Web应用程序从InProc更改为StateServer。
  • 检出configuration状态服务器维护会话状态(IIS 7)开始。 🙂

看看这个MSDN博客: 进程中的会话状态pipe理

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

我很长一段时间没有更改代码(最后更改:2016年7月20日)

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

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

也许它会帮助你。