2011-07-27 148 views
2

我有一个坐在两个web服务器(IIS)上的ASP.NET 3.5 webforms应用程序,并通过具有粘性亲和力的内容切换进行负载平衡。我有一个将数据放入会话变量的页面,javascript会打开一个新的浏览器窗口,并在该页面的page_load事件中检索该会话变量并显示数据。会话状态奇怪的行为

问题是,在所有版本的IE中,大约有十分之七的数据没有显示。如果我不断刷新新打开的窗口,它将最终显示数据。我可以验证在浏览器窗口打开之前,会话变量是有效的。

另一个麻烦就是firefox没有这个问题。数据在第一次100%时显示。问题是我们没有(正式)支持Firefox。

我们无权访问任何第三方数据存储(如MSSQL或MySQL),因此在此处存储会话数据不存在选项。另外,缓存数据客户端的能力并不实际,在某些情况下不是一种选择。

这不会发生在本地或我们的测试环境(这是不负载平衡),所以我真的很困惑。任何帮助将不胜感激。

谢谢。

+0

所有版本的IE?我期望这在IE8,因为每个浏览器选项卡/窗口创建一个新的会话,但在IE8之前,我会预计它的工作。 –

回答

3

您使用哪种会话存储提供程序? InProc,StateServer?它听起来像你使用InProc。如果是这样,由于您无法访问数据库,切换到StateServer可能是您的答案。

这里有一篇关于ASP.NET load balancing and ASP.NET state server的文章,可能对您有所帮助。

+0

但是,为什么它会在Firefox中正常工作,但不是所有的东西都是平等的? – pattyboy1971

+0

可能是由于负载均衡器处理服务器关联(可能是ip,cookie或基于响应头)以及不同浏览器是否将该信息从新窗口传递回服务器。 –

+0

感谢您的帮助。我将看看状态服务器选项,并让你知道它是如何工作的。 – pattyboy1971

1

你提到你正在使用粘滞会话/亲和力。您是否可以确认您的负载均衡器正在查看HTTP Cookie(不仅是IP地址)以确定粘性,因为在单个会话期间IP地址可能会发生变化(例如,在有线和无线网络之间对接笔记本电脑)。

+0

我会仔细检查网络管理员。 – pattyboy1971

+0

很抱歉忘了提及我们使用的是端口443和SSL,所以我们必须使用IP。 – pattyboy1971

+0

那么这可能是你的问题。您必须使用其他答案中提到的状态服务器。 –