6

因此,我使用 SQL Server 2008 和 temp 数据库设置了 SQL Server 会话状态,今天我决定查看表中的数据,结果发现它在 ASPStateTempApplications 表中:

AppId AppName
538231025 /lm/w3svc/1/root
611758131 /lm/w3svc/3/root
802488340 /lm/w3svc/4/root
-940085065 /lm/w3svc/4/root/webapp
685293685 /lm/w3svc/5/root
1210055478 /lm/w3svc/5/root/webapp

我们有 2 个负载平衡的 Web 服务器。

当我查看两台服务器的 Web 应用程序的 ID 时,我发现 web1 的 app1 的 ID 为 4,而 web2 的 app1 的 ID 为 5。同样的事情发生在另一个应用程序上。web1 的 app2 的 ID 为 1,而 web2 的 app2 的 ID 为 3。

我的常识告诉我,Web 服务器不共享会话,因为会话 id 使用 appid。我对么?如果是这样,为什么这个小细节在文档中不那么明显?我应该让两个 Web 服务器上的 id 匹配吗?

4

1 回答 1

6

AppId 在创建 SessionId 期间使用,以帮助避免从一个应用程序到另一个应用程序的冲突。它是通过计算 IIS 应用程序路径的哈希来创建的。

在您的环境中,流程可能是这样的:

  1. 服务器 A 创建一个会话 ID,将其设置在 cookie 中,并将一些数据存储在相应的会话中(ASPStateTempSessions 中的一行)。会话 ID 列是通过连接会话 ID 与 AppID 来创建的。
  2. 服务器 B 接收具有预先存在的会话 ID 的请求,并使用它从 ASPStateTempSessions 表中查找关联的会话数据。如果app ID不同,生成的key也会不同。

具有不同 AppId 的多台服务器共享相同会话的最终效果是,一台服务器创建的 ID 不会与另一台服务器的 ID 冲突,并且具有不同 AppId 的机器不会看到彼此的会话。

于 2009-12-01T03:05:18.370 回答