在IIS7.5和8.0之间共享ASP.NET状态服务会话不起作用

我有一个由5台运行IIS 7.5的Server 2008R2机器组成的Web场。 所有这些都使用一个单独的,运行ASP.NET State Service的服务器(这个也运行2008 R2)共享会话状态。 一切都很好。

不过,我现在添加了第六台服务器,这个服务器运行的是2012 / IIS 8.0。 对于我的生活,我无法让这台服务器与其他服务器共享会话状态。

machineKeyconfiguration完全相同(匿名):

<machineKey validationKey="XYZ" decryptionKey="ZYX" validation="SHA1" /> 

应用程序ID在所有服务器上是完全相同的(我们运行多个网站,但都具有以编程方式创build的ID,configuration是相同的,并在运行时validation):

 /LM/W3SVC/10351/ROOT 

所有网站也有相同的AppPath,也在运行时validation:

 D:\SomeSite\SomApp\ 

会话configuration也完全一样:

 <sessionState mode="StateServer" partitionResolverType="MyStateServerPartitionResolver" stateNetworkTimeout="30" timeout="20" /> 

MyStateServerPartitionResolver类非常简单,只是抽象的事实,我们通过我们自己的configuration加载连接string(connectionString值是相同的所有服务器上,也validation):

 public class MyStateServerPartitionResolver : IPartitionResolver { private string connectionString; public void Initialize() { connectionString = ConfigSettings.StateServerConnectionString; } public string ResolvePartition(object key) { return connectionString; } } 

所有在.NET 4.0上运行的站点和应用程序池configuration完全一样。

我可以缩小到唯一的区别是,工作服务器都运行IIS 7.5,而非工作服务器运行IIS 8.0。 不过,我认为这是一个支持的情况,否则很难进行滚动升级。

任何build议我可以做什么来debugging呢? 或者IIS 7.5和8.0不能共享会话状态的任何文档确认?

所以这就是在这个简单的问题上瞎了眼的经典时刻。

虽然所有的机器都完全更新,configuration是完全相同的,但是我错过了一个事实,那就是Server 2012诞生了本地安装的.NET 4.5。 即使您select了v4.0作为IIS中的.NET Framework版本,它实际上在后台运行4.5。

而且幸运的是,会话密钥在4.0和4.5之间变化,因此当用户在运行4.0和4.5的服务器之间切换时会导致会话松动。

在所有2008 R2服务器上安装.NET 4.5 Framework已经解决了这个问题。