0

我有一个在两台负载平衡服务器上运行的 ASP.NET 应用程序。除了一组客户外,一切都运行良好。所有这些客户都来自同一家公司。随机抛出未处理的 NullReferenceException 错误。它在随机地点随机发生。似乎会话完全消失了。因为这只发生在特定的用户组中,我不得不假设这与他们的环境有关。我见过使用 IE6、IE7、IE8 和 FF 的用户,并且在所有情况下都会出现错误。

我不是 100% 确定如何解决这个问题。有没有人有任何想法?

编辑:会话设置为“InProc”

<sessionState mode="InProc" cookieless="false" timeout="20" />
4

4 回答 4

1

InProc 会话不在服务器之间共享,因此听起来这组用户正在从一台服务器移动到另一台服务器,而其他用户则没有。也许您的负载均衡器正在尝试使用 IP 地址或其他任何内容来实现粘性会话,而该组织正在阻止该信息。

于 2010-07-08T22:15:12.930 回答
1

我与遇到问题的用户取得了联系。我让他打开浏览器并访问 whatsmyip.org 并告诉我它说的是他的 IP 地址。然后我让他刷新几次屏幕。好吧,你不知道吗,IP地址改变了。它不断在两个不同的 IP 地址之间切换。这不是他机器的 IP 地址,而是两个不同代理的 IP 地址。显然,每个请求都可能来自一个或另一个。

我们的负载均衡器(称为 Zeus - 我不是网络人)设置为使用 IP 地址建立会话亲和性(又名粘性连接)。我们更改了设置,以便负载均衡器删除一个 cookie 并使用它来维护会话,现在一切正常。

于 2010-07-23T22:22:08.497 回答
0

如果您使用 SQL 来存储会话状态,请检查场中的所有服务器是否都在查看同一个 SQL 数据库 - 我之前已经被这个数据库所吸引,并且花了很长时间才解决这个问题!

编辑: 实际上,您可能需要将其设置StateServer为在网络场中运行时。请参阅MSDN 中的有关会话状态模式的信息。

于 2010-07-08T21:58:40.640 回答
0

如果您的负载平衡基于将每次点击定向到最不忙的服务器,那么 InProc 将无法正常工作。您将需要使用 StateServer 或 SQLServer 模式。

想象一下,来自客户端的第一次命中被定向到服务器 A - 这在服务器 A 上启动了一个新会话。来自同一客户端的第二次命中可以转到服务器 B,从服务器 A 提供服务器 B 无法识别的会话 cookie。

如果您有“粘性”(或客户端亲和性)负载平衡,其中第一个命中分配给最不忙的服务器,但随后来自同一会话的命中被定向到同一服务器,那么 InProc 应该仍然可以工作。

于 2010-07-08T22:13:11.000 回答