我们在ASP.NET网站上遇到了一个问题,用户的会话行为异常-会话数据出现,消失和重新出现。
我想我知道问题出在哪里:
- 我们的设置是2 x负载平衡的WebServers +单会话状态数据库。
- ASP.NET SQL会话状态存储似乎依赖于IIS网站实例ID(元数据库ID)来唯一标识传入的会话Cookie ID和检索/存储值。
- 网站的IIS网站实例ID在每个活动服务器上都不同(WebServer A上的ID / W3SVC / 1 / Root,Web Server B上的ID / W3SVC / 2 / Root)。
- 负载平衡未使用客户端亲缘关系,因此每个用户HTTP请求都可以发送到任一服务器。
因此,当用户登录到站点并四处移动时,每个HTTP调用都可以转到任一Web服务器,因此根据服务器使用具有不同ID的会话状态记录。实际上,用户将同时具有2个单独的会话实例。我相信我已经验证这是在数据库ASPStateTempSessions表,每个会话cookie ID似乎对应于2 几乎相同名称的记录(其ID只有最后几个字符,我相信是基于改性剂不同的AppID从AspStateTempApplications表)在几秒钟内创建。
因此,会话状态似乎行为不当,因为对一个会话记录所做的更改只会在该Web服务器上持续存在。如果用户移至另一台负载平衡的服务器,则会话值似乎消失或还原。
我相信解决方案是同步站点的IIS实例ID(例如,使它们都成为/ W3SVC / 1 / Root),但是我尝试在IIS中的“高级设置”下编辑该值,尽管它保存确定,但它只是使网站在该服务器上返回404,直到我将其改回为止。
我找到了解决此问题的VBS脚本,但它似乎仅适用于IIS 6,因此我担心尝试这样做。是否有人在IIS 7.5上遇到过这种情况,您如何解决它?
编辑/解决方案
我的错误是我在IIS中更改了站点实例ID后忘记重新启动IIS。此后,将更新ID,并在两个Web服务器上同步ASP.NET会话。
完整说明:
- 将远程桌面连接到服务器LIVE1,打开IIS Mgr,单击有问题的站点,然后在侧栏中选择“ 高级设置”。
- 将ID更改为唯一的名称,例如10.单击OK。
- 重新启动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
。需要管理员特权,但此后仍需要重新设置。