Потеря состояния сеанса с ASP.NET/SQL Server
У меня есть рабочий процесс ASP.NET MVC, настроенный как два веб-сайта, управляемых балансировщиком нагрузки. Веб-сайты используют Sql Server в качестве поставщика состояния сеанса и отключают аутентификацию (это не обязательно).
Теперь, время от времени, я, кажется, теряю состояние сеанса, и я полагаю, что это потому, что запрос обрабатывается альтернативным сервером, поэтому, по сути, пользователь переходит с сервера на сервер, в зависимости от того, как балансировщик нагрузки сочтет нужным. Я не всегда "теряю состояние сеанса" на одной и той же стадии рабочего процесса, поэтому я считаю, что это связано с конфигурацией веб-фермы + состоянием сеанса сервера SQL.
Оба приложения используют один и тот же ключ компьютера для шифрования и дешифрования состояния сеанса, хранящегося на сервере SQL.
Конфигурация на обоих серверах выглядит следующим образом:
<authentication mode="None" />
<sessionState mode="SQLServer" sqlConnectionString="{connection-string}" />
<machineKey decryptionKey="777CB456774AF02F7F1AC8570FAF31545B156354D9E2DAAD"
validationKey="89B5B536D5D17B8FE6A53CBB3CA8B8695289BA3DF0B1370BC47D362D375CF91525DDB5307D8A288230DCD4B3931D23AED4E223955C45CFF2AF66BCC422EC7ECD" />
Я подтвердил, что это идентично на обоих серверах, мне чего-то не хватает?
Это не происходит в моей среде разработки, когда я использую один сервер.
Я боюсь, что страдаю от пятничного блюза, и, без сомнения, выясню ответ на следующей неделе, к сожалению, я не хочу ждать!
Есть идеи?
3 ответа
Нашел проблему.
Когда вы создаете приложения, для которых вы хотите использовать общее состояние сеанса с помощью Sql Server, им требуется тот же идентификатор, который настроен в IIS. Это связано с тем, что сгенерированный идентификатор сеанса генерируется на основе идентификатора приложения. (Внутренний идентификатор приложения похож на LM/W3SVC/1
Два сервера имели разные идентификаторы для каждого приложения в IIS. Решение заключается в изменении идентификатора в разделе "Управление веб-сайтом -> Дополнительные параметры" на каждом сервере.
- С помощью диспетчера IIS дважды проверьте настройки ключа компьютера как на корневом уровне, так и на уровне веб-сайта.
Просмотрите модификатор IsolateApps на элементе ключа машины - http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.100%29.aspx
Вы недавно обновились с 3.5 до 4.0?
В крайнем случае - перезапустите appPools на обеих машинах и перезапустите IIS.
Сессии имеют (веб) область применения. Посмотрите, поможет ли это MS KB.
Обновление: интересное отрицательное голосование. Возможно, мое предложение нуждается в большей ясности.
В дополнение к соответствию машинным ключам, вы также должны соответствовать конфигурации IIS для сайтов (так что это "то же приложение" (путь к приложению) в IIS).