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


14

我们在ASP.NET网站上遇到了一个问题,用户的会话行为异常-会话数据出现,消失和重新出现。

我想我知道问题出在哪里:

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

因此,当用户登录到站点并四处移动时,每个HTTP调用都可以转到任一Web服务器,因此根据服务器使用具有不同ID的会话状态记录。实际上,用户将同时具有2个单独的会话实例。我相信我已经验证这是在数据库ASPStateTempSessions表,每个会话cookie ID似乎对应于2 几乎相同名称的记录(其ID只有最后几个字符,我相信是基于改性剂不同的AppIDAspStateTempApplications表)在几秒钟内创建。

因此,会话状态似乎行为不当,因为对一个会话记录所做的更改只会在该Web服务器上持续存在。如果用户移至另一台负载平衡的服务器,则会话值似乎消失或还原。

我相信解决方案是同步站点的IIS实例ID(例如,使它们都成为/ W3SVC / 1 / Root),但是我尝试在IIS中的“高级设置”下编辑该值,尽管它保存确定,但它只是使网站在该服务器上返回404,直到我将其改回为止。

找到了解决此问题的VBS脚本,但它似乎仅适用于IIS 6,因此我担心尝试这样做。是否有人在IIS 7.5上遇到过这种情况,您如何解决它?


编辑/解决方案

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

完整说明:

  1. 将远程桌面连接到服务器LIVE1,打开IIS Mgr,单击有问题的站点,然后在侧栏中选择“ 高级设置”
  2. 将ID更改为唯一的名称,例如10.单击OK。
  3. 重新启动Web服务(c:\windows\system32\iisreset /restart

对LIVE2执行相同操作(确保站点ID与LIVE1相同)

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

还请注意,您可以通过在每台服务器上的IIS配置文件中编辑site id属性来手动进行这些更改C:\Windows\System32\inetsrv\config\applicationHost.config。需要管理员特权,但此后仍需要重新设置。

Answers:


11

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

您还必须同步用于加密的机器密钥,以便任何形式的身份验证等正常工作。我不确定这可能也会影响会话标识。

在IIS 7中配置机器密钥

此外,您应该利用计算机之间的共享配置,它本身可能会使用不同的计算机密钥解决此问题。

Web服务器场的IIS配置同步?

编辑:当您更改站点ID时,是否尝试重新启动IIS管理器以查看webroot是否已更改?也许配置已连接到ID,这意味着ID的更改也会修改文档根目录等内容


感谢Jimshi的想法,但我已经在web.configs中同步了machineKey。我想我真的在寻找一种更改站点的IIS实例ID的方法,而不必完全删除并重新配置Web服务器上的站点。
詹姆斯·麦考马克

更改站点ID时,是否尝试重新启动IIS管理器以查看webroot是否已更改?也许该配置连接到ID含义,在ID的变化也改变的东西,如文档根等
忌食

1
是的,就是这样!我忘记了重新启动IIS服务(命令行iisreset / restart)。之后工作正常!请使用此信息更新您的答案,我会给您接受的答案。
詹姆斯·麦考马克

木已成舟。很高兴为您解决。
jishi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.