У меня есть веб-ферма, состоящая из 5 машин Server 2008R2, работающих под управлением IIS 7.5. Все они совместно используют состояние сеанса с помощью одного отдельного сервера, на котором работает служба состояний ASP.NET (на этом также работает 2008 R2). Все работает замечательно.
Однако теперь я добавил шестой сервер, на котором работает 2012 / IIS 8.0. Блин, я не могу заставить этот сервер делиться состоянием сеанса с другими серверами.
Конфигурация machineKey такая же (анонимная):
<machineKey validationKey="XYZ" decryptionKey="ZYX" validation="SHA1" />
Идентификатор приложения одинаков на всех серверах (мы запускаем несколько веб-сайтов, но у всех идентификатор создан программно, конфигурация идентична, также проверяется во время выполнения):
/LM/W3SVC/10351/ROOT
Все сайты также имеют один и тот же AppPath, также проверенный во время выполнения:
D:\SomeSite\SomApp\
Конфигурация сеанса такая же:
<sessionState mode="StateServer" partitionResolverType="MyStateServerPartitionResolver" stateNetworkTimeout="30" timeout="20" />
Класс MyStateServerPartitionResolver очень прост, просто абстрагируется от того, что мы загружаем строку подключения через нашу собственную конфигурацию (значение connectionString идентично на всех серверах, также проверено):
public class MyStateServerPartitionResolver : IPartitionResolver
{
private string connectionString;
public void Initialize()
{
connectionString = ConfigSettings.StateServerConnectionString;
}
public string ResolvePartition(object key)
{
return connectionString;
}
}
Все сайты работают на .NET 4.0, и конфигурация пула приложений такая же.
Единственное отличие, которое я могу сузить, заключается в том, что все рабочие серверы работают под управлением IIS 7.5, а неработающий - под управлением IIS 8.0. Тем не менее, я бы ожидал, что это будет поддерживаемый сценарий, поскольку в противном случае было бы сложно выполнить последовательное обновление.
Есть предложения, что я могу сделать, чтобы отладить это? Или какое-либо документальное подтверждение того, что IIS 7.5 и 8.0 не могут совместно использовать состояние сеанса?
Так что это оказался классический момент, когда вы вслепую смотрели на простой вопрос.
Хотя все машины были полностью обновлены и конфигурация была идентична, я упустил тот факт, что Server 2012 родился с установленной .NET 4.5. И хотя вы выбрали v4.0 в качестве версии .NET Framework в IIS, на самом деле 4.5 негласно запускается.
И, как назло, ключ сеанса изменился между 4.0 и 4.5, что привело к потере сеансов при переключении пользователя между серверами с 4.0 и 4.5.
Установка .NET 4.5 Framework на все серверы 2008 R2 устранила проблему.