у нас есть проблема с веб-сайтом ASP.NET, где пользовательские сессии ведут себя странно - данные сессий появляются, исчезают и снова появляются.
Я думаю, я знаю, в чем проблема:
- Наша установка - это 2 x WebServers с балансировкой нагрузки + база данных состояния одного сеанса.
- Хранилище состояния сеанса ASP.NET SQL, по-видимому, зависит от идентификатора экземпляра веб-сайта IIS (идентификатора метабазы) для однозначной идентификации идентификатора cookie входящего сеанса и получения / сохранения значений.
- Идентификатор экземпляра веб-сайта IIS на каждом из действующих серверов различен (ID / W3SVC / 1 / Root на веб-сервере A, ID / W3SVC / 2 / Root на веб- сервере B).
- Балансировка нагрузки не использует привязку клиента, поэтому каждый пользовательский HTTP-запрос может идти на любой сервер.
Поэтому, когда пользователь входит на сайт и перемещается, каждый HTTP-вызов может перейти на любой веб-сервер и, следовательно, использовать запись состояния сеанса с разными идентификаторами в зависимости от сервера. По сути, у пользователя одновременно будет 2 отдельных экземпляра сеанса. Я полагаю, что я проверил это, как и в таблице ASPStateTempSessions базы данных , каждый идентификатор файла cookie сеанса, кажется, соответствует 2 почти идентично названным записям (их идентификаторы отличаются только на последние несколько символов, которые, я считаю, являются модификатором на основе AppID из Таблица AspStateTempApplications ), созданная за считанные секунды.
Следовательно, состояние сеанса будет некорректно работать, поскольку изменения, внесенные в одну запись сеанса, будут сохраняться только на этом веб-сервере. Если пользователь переместится на другой сервер с балансировкой нагрузки, значения сеанса могут исчезнуть или вернуться.
Я полагаю, что решение состоит в том, чтобы синхронизировать идентификаторы экземпляров IIS сайтов (например, сделать их оба / W3SVC / 1 / Root ), но я попытался отредактировать это значение в IIS в разделе «Дополнительные параметры», и, хотя он сохранил «ОК», он просто сделал сайт возвращал 404s на этот сервер, пока я не изменил его обратно.
Я нашел сценарий VBS для этой проблемы, но, похоже, он предназначен только для IIS 6, так что я беспокоюсь об этом. Кто-нибудь еще сталкивался с такой ситуацией на IIS 7.5, и как вы это исправили?
РЕДАКТИРОВАТЬ / РЕШЕНИЕ
Моя ошибка заключалась в том, что я забыл перезапустить IIS после изменения идентификатора экземпляра сайта в IIS. После этого идентификатор был обновлен, и сеансы ASP.NET были синхронизированы на двух веб-серверах.
Полные инструкции:
- Удаленный рабочий стол на сервере LIVE1, откройте IIS Mgr, нажмите на проблемный сайт и выберите Дополнительные настройки на боковой панели.
- Измените идентификатор на что-то уникальное, например, 10. Нажмите OK.
- Перезапустите веб-сервис (
c:\windows\system32\iisreset /restart
)
Сделайте то же самое для LIVE2 (убедитесь, что идентификатор сайта такой же, как на LIVE1)
Обратите внимание, что идентификатор сайта влияет на расположение файлов сайта, например, папка файла журнала станет, C:\inetpub\logs\LogFiles\W3SVC10
например.
Отметим также , что вы могли бы сделать эти изменения вручную путем редактирования сайта ID атрибута в IIS файл конфигурации на каждом сервере: C:\Windows\System32\inetsrv\config\applicationHost.config
. Требуется администраторская привилегия и все еще требуется сброс после этого.