负载平衡的IIS 7.5 Web服务器ASP.NET会话状态问题

我们遇到ASP.NET用户会话performanceexception的问题 – 会话数据出现,消失和重新出现。

我想我知道问题是什么:

  1. 我们的设置是2 x负载平衡WebServers +单一会话状态数据库。
  2. ASP.NET SQL会话状态存储似乎依赖于IIS网站实例ID(元数据库ID)来唯一标识传入会话Cookie ID和检索/存储值。
  3. 每个活动服务器(Web服务器A上的ID / W3SVC / 1 / Root ,Web服务器B上的ID / W3SVC / 2 / Root)上的网站的IIS网站实例ID是不同的。
  4. 负载平衡不使用客户端关联,所以每个用户的HTTP请求可以到任一服务器。

因此,当用户login到站点并四处移动时,每个HTTP调用可以转到任一Web服务器,因此根据服务器使用具有不同ID的会话状态logging。 实际上,用户将同时拥有2个独立的会话实例。 我相信我已经validation了这一点,在数据库ASPStateTempSessions表中,每个会话Cookie ID似乎对应于2个几乎相同的命名logging(它们的ID仅相差最后几个字符,我相信它们是基于来自AspStateTempApplications表)创build在几秒钟内。

因此,会话状态将显得不当行为,因为对一个会话logging所做的更改只会对该Web服务器持续存在。 如果用户移动到其他负载平衡服务器,会话值似乎消失或恢复。

我相信解决scheme是同步网站的IIS实例ID(例如,使他们都/ W3SVC / 1 /根 ),但我试图编辑在高级设置下IIS的值,虽然它保存好,它只是使网站在该服务器上返回404s,直到我将其更改回来。

我发现这个问题的VBS脚本 ,但它似乎只用于IIS 6,所以我很担心尝试它。 有其他人在IIS 7.5上遇到这种情况,你是如何解决这个问题的?


编辑/解决scheme

我的错误是,我忘记在IIS中更改站点实例ID后重新启动IIS。 在此之后,ID被更新,ASP.NET会话在两个Web服务器上同步。

完整的说明:

  1. 远程桌面到服务器LIVE1上,打开IISpipe理器,点击问题网站,然后select侧边栏中的高级设置
  2. 将ID更改为唯一的例如10.单击确定。
  3. 重新启动Web服务( c:\windows\system32\iisreset /restart

为LIVE2做同样的事情(确保Site ID和LIVE1一样)

请注意,站点ID确实会影响站点文件的位置,例如,日志文件文件夹将变为C:\inetpub\logs\LogFiles\W3SVC10

另请注意,您可以通过编辑每个服务器上的IISconfiguration文件中的站点ID属性来手动执行这些更改: C:\Windows\System32\inetsrv\config\applicationHost.config 。 需要pipe理员权限,然后仍然需要重置。

从你的问题来看,你似乎有一个中央会话状态服务器(DB?),跟踪会话数据?

您还必须同步用于任何表单身份validation等encryption工作的机器密钥。 这可能也会影响会话识别,我不确定。

http://technet.microsoft.com/en-us/library/cc755177%28WS.10%29.aspx

此外,你应该使用机器上的共享configuration,它可能会用不同的机器键来解决问题。

Web服务器场的IISconfiguration同步?

编辑:当你改变了站点ID,你尝试重新启动IISpipe理器,看看是否webroot已经改变? 也许configuration连接到ID,这意味着ID的变化也会修改像文档根等东西