我有一个由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已经解决了这个问题。