我们的 ASP.NET 网站出现问题,其中用户会话行为异常 - 会话数据出现、消失并重新出现。
我想我知道问题是什么:
- 我们的设置是 2 x 负载平衡 Web 服务器 + 单一会话状态数据库。
- ASP.NET SQL 会话状态存储似乎依赖于 IIS 网站实例 ID(Metabase ID)来唯一标识传入的会话 cookie ID 并检索/存储值。
- 网站的 IIS 网站实例 ID 在每台实时服务器上都不同(ID/W3SVC/1/根在 Web 服务器 A 上,ID/W3SVC/2/根在 Web 服务器 B 上)。
- 负载平衡不使用客户端亲和性,因此每个用户 HTTP 请求都可以转到任一服务器。
因此,当用户登录网站并四处移动时,每个 HTTP 调用都可以转到任一 Web 服务器,因此根据服务器使用具有不同 ID 的会话状态记录。实际上,用户将同时拥有 2 个单独的会话实例。我相信我已经在数据库中验证了这一点状态会话表中,每个会话 cookie ID 似乎对应 2几乎同名记录(它们的 ID 仅在最后几个字符上有所不同,我相信这是基于应用程序ID来自AspStateTemp应用程序这些表的创建时间相隔仅几秒。
因此,会话状态似乎会出现异常,因为对一个会话记录所做的更改只会在该 Web 服务器上保留。如果用户移动到其他负载平衡服务器,会话值似乎会消失或恢复。
我认为解决方案是同步网站的 IIS 实例 ID(例如让它们都/W3SVC/1/根),但我尝试在 IIS 的高级设置下编辑该值,虽然它保存正常,但它只是让网站在该服务器上返回 404 错误,直到我将其改回来。
我找到一个 VBS 脚本这个问题似乎只适用于 IIS 6,所以我很担心尝试它。有没有其他人在 IIS 7.5 上遇到过这种情况,你是如何解决的?
编辑/解决方案
我的错误是,我在 IIS 中更改站点实例 ID 后忘记重新启动 IIS。此后,ID 已更新,并且两个 Web 服务器上的 ASP.NET 会话已同步。
完整说明:
- 远程桌面进入服务器 LIVE1,打开 IIS Mgr,单击问题站点并选择高级设置在侧边栏中。
- 将 ID 更改为唯一的数字,例如 10。单击“确定”。
- 重新启动 Web 服务 (
c:\windows\system32\iisreset /restart
)
对 LIVE2 执行相同操作(确保站点 ID 与 LIVE1 上的相同)
请注意,站点 ID 确实会影响站点文件的位置,例如日志文件文件夹将会变成C:\inetpub\logs\LogFiles\W3SVC10
这样。
另请注意,您可以通过编辑网站手动进行这些更改ID每台服务器上的 IIS 配置文件中的属性:C:\Windows\System32\inetsrv\config\applicationHost.config
。需要管理员权限,并且之后仍需要重置。
答案1
根据您的问题,似乎您有一个中央会话状态服务器(DB?)来跟踪会话数据?
您还必须同步用于加密的机器密钥,以使任何表单身份验证等工作正常。这可能还会影响会话识别,我不确定。
此外,您应该利用机器之间的共享配置,它本身可能会解决不同机器密钥的问题。
编辑:当您更改站点 ID 时,您是否尝试重新启动 IIS 管理器以查看 webroot 是否已更改?也许配置与 ID 有关,这意味着 ID 的更改也会修改文档根目录等内容