您提到您在负载平衡环境中遇到过这个问题,对吗?我假设您正在使用默认的“In Proc”方法来存储会话数据。如果是这样的话,那么我想我知道会发生什么。(为了争论,我假设有 2 个服务器,但如果你有更多也没关系)
您被发送到 ServerA 并创建了一个会话。因为这是 In Process ServerB 对此一无所知。最终(以及如何发生这种情况取决于您的负载均衡器的设置方式。粘性会话?Cookies?轮询?)您将被发送到 ServerB。因为那个服务器不知道你已经有一个会话;创建一个新的,并为您提供一个新的会话 ID。
那么为什么它会发生在您的精确复制步骤下?好吧,我的预感是,如果有足够的时间和负载,您会看到它只是从 /page1 导航到 /page2。同样 - 这取决于您的负载均衡器的设置方式,但可能是因为您正在更改触发某些东西的协议并且您被发送到池中的另一台服务器。
你怎么能解决它?
首先,确保您在他们的 machine.config 中有相同的机器密钥。如果您无权访问它,我认为它可以在 web.config 中使用,但我还没有尝试过。
现在,设置另一种存储会话状态的方式。也许在 Sql Server 或 MySql 或 Postgres 或任何地方。如果您有 SQL Server,那将是最简单的,因为驱动程序已构建它,但如果您有另一个数据存储,您将需要构建或找到可以执行此操作的库。我参与了一个使用 Postgres 存储会话状态的项目。
我们使用npgsql作为驱动连接到服务器,并构建了我们自己的PgsqlSessionProvider:SessionStateStoreProviderBase
并连接它实际上非常容易
<sessionState mode="Custom" customProvider="PgsqlSessionProvider">
<providers>
<add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" />
</providers>
</sessionState>