【问题标题】:SQL Server Session State, web farm, and IIS configurationSQL Server 会话状态、Web 场和 IIS 配置
【发布时间】:2009-11-30 22:22:30
【问题描述】:

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

AppId 应用名称
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 匹配吗?

【问题讨论】:

    标签: asp.net sql-server iis-7 sql-session-state


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 根据这篇文章:msdn.microsoft.com/en-us/library/aa478952.aspxASPTasteTempSessions表的sessionid是Session ID + application ID。您对 ASP.NET 更改上下文的会话 ID 并跨服务器使用它有多大把握?
    • 我刚刚使用 Fiddler 和 SSMS 验证 AppId 确实连接到会话 ID 的末尾作为 ASPStateTempSessions 表中的键。我已经相应地更新了我的答案。
    • 换句话说,我的假设是正确的,我应该确保同一个应用的整个网络农场的应用 ID 相同
    • 是的,虽然另一种方法是修改 TempGetAppID 存储过程以始终返回相同的值,而不是散列应用程序名称等。
    • @BMTU 我在 IIS 7 中这样做了。右键单击网站 - 托管网站 - 高级设置。更改 ID 属性以匹配所有网络服务器。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 2019-10-28
    • 2013-08-08
    • 2010-10-22
    • 2018-12-01
    • 2023-03-10
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多