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

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

我们的 ASP.NET 网站出现问题,其中用户会话行为异常 - 会话数据出现、消失并重新出现。

我想我知道问题是什么:

  1. 我们的设置是 2 x 负载平衡 Web 服务器 + 单一会话状态数据库。
  2. ASP.NET SQL 会话状态存储似乎依赖于 IIS 网站实例 ID(Metabase ID)来唯一标识传入的会话 cookie ID 并检索/存储值。
  3. 网站的 IIS 网站实例 ID 在每台实时服务器上都不同(ID/W3SVC/1/根在 Web 服务器 A 上,ID/W3SVC/2/根在 Web 服务器 B 上)。
  4. 负载平衡不使用客户端亲和性,因此每个用户 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 会话已同步。

完整说明:

  1. 远程桌面进入服务器 LIVE1,打开 IIS Mgr,单击问题站点并选择高级设置在侧边栏中。
  2. 将 ID 更改为唯一的数字,例如 10。单击“确定”。
  3. 重新启动 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?)来跟踪会话数据?

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

在 IIS 7 中配置计算机密钥

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

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

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

相关内容