你提到你在负载平衡的环境中有这个问题,对吧?我假设你正在使用存储会话数据的默认“In Proc”方法。如果是这样的话,那么我想我知道会发生什么。 (为了争辩,我将假设2台服务器,但是如果你有更多的服务器并不重要)
你被发送到ServerA并创建一个会话。因为这是在进程中ServerB不知道它。最终(以及发生的方式是如何设置您的负载均衡器的问题。粘滞会话?Cookie?循环?),您将被发送到ServerB。因为该服务器有不知道你已经有一个会话;会创建一个新的会话ID并给您一个新的会话ID。
那么,为什么它在你的确切的repro步骤下发生?那么,我的直觉是,如果有足够的时间和负载,你会看到它只是从/ page1导航到/ page2。再次 - 这取决于您的负载均衡器是如何设置的,但可能是因为您正在更改触发某些内容的协议,并将您发送到池中的另一台服务器。
如何解决?
要开始,请确保您的machine.config中具有相同的机器密钥。如果你没有访问权限,我认为它会在web.config中工作,但我没有尝试过。
现在,建立另一种存储会话状态的方式。在Sql Server或者MySql或者Postgres或者任何地方。如果你拥有SQL Server,它将是驱动程序构建以来最简单的,但是如果你有另一个数据库,你需要构建或者找到一个能够实现它的库。我参与了一个使用Postgres存储会话状态的项目。
我们使用npgsql作为驾驶员conenct到服务器,并建立了自己的PgsqlSessionProvider:SessionStateStoreProviderBase
和挂钩起来其实是很容易的
<sessionState mode="Custom" customProvider="PgsqlSessionProvider">
<providers>
<add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" />
</providers>
</sessionState>
[我怎么可以共享一个asp.net会话之间的
来源
2013-10-17 16:03:32
Joe
可能重复HTTP和https](http:// stackoverflow。COM /问题/ 567535 /何灿的i-共享的-ASP净会话间的HTTP和HTTPS) –
我不知道为什么它的工作在其他浏览器,但它不应该是。除非您将会话cookie配置为安全,否则它们在http和https之间始终会有所不同。 –
呀,好点,但我的理解是B/C我是不是我的cookie设置为与饼干“安全=真正的”应该与HTTPS和HTTP持续。这是否是好的做法,这是客户的愿望。 –