Проблема состояния сеанса ASP.NET веб-сервера IIS 7.5 с балансировкой нагрузки

14

у нас есть проблема с веб-сайтом ASP.NET, где пользовательские сессии ведут себя странно - данные сессий появляются, исчезают и снова появляются.

Я думаю, я знаю, в чем проблема:

  1. Наша установка - это 2 x WebServers с балансировкой нагрузки + база данных состояния одного сеанса.
  2. Хранилище состояния сеанса ASP.NET SQL, по-видимому, зависит от идентификатора экземпляра веб-сайта IIS (идентификатора метабазы) для однозначной идентификации идентификатора cookie входящего сеанса и получения / сохранения значений.
  3. Идентификатор экземпляра веб-сайта IIS на каждом из действующих серверов различен (ID / W3SVC / 1 / Root на веб-сервере A, ID / W3SVC / 2 / Root на веб- сервере B).
  4. Балансировка нагрузки не использует привязку клиента, поэтому каждый пользовательский HTTP-запрос может идти на любой сервер.

Поэтому, когда пользователь входит на сайт и перемещается, каждый HTTP-вызов может перейти на любой веб-сервер и, следовательно, использовать запись состояния сеанса с разными идентификаторами в зависимости от сервера. По сути, у пользователя одновременно будет 2 отдельных экземпляра сеанса. Я полагаю, что я проверил это, как и в таблице ASPStateTempSessions базы данных , каждый идентификатор файла cookie сеанса, кажется, соответствует 2 почти идентично названным записям (их идентификаторы отличаются только на последние несколько символов, которые, я считаю, являются модификатором на основе AppID из Таблица AspStateTempApplications ), созданная за считанные секунды.

Следовательно, состояние сеанса будет некорректно работать, поскольку изменения, внесенные в одну запись сеанса, будут сохраняться только на этом веб-сервере. Если пользователь переместится на другой сервер с балансировкой нагрузки, значения сеанса могут исчезнуть или вернуться.

Я полагаю, что решение состоит в том, чтобы синхронизировать идентификаторы экземпляров IIS сайтов (например, сделать их оба / W3SVC / 1 / Root ), но я попытался отредактировать это значение в IIS в разделе «Дополнительные параметры», и, хотя он сохранил «ОК», он просто сделал сайт возвращал 404s на этот сервер, пока я не изменил его обратно.

Я нашел сценарий VBS для этой проблемы, но, похоже, он предназначен только для IIS 6, так что я беспокоюсь об этом. Кто-нибудь еще сталкивался с такой ситуацией на IIS 7.5, и как вы это исправили?


РЕДАКТИРОВАТЬ / РЕШЕНИЕ

Моя ошибка заключалась в том, что я забыл перезапустить IIS после изменения идентификатора экземпляра сайта в IIS. После этого идентификатор был обновлен, и сеансы ASP.NET были синхронизированы на двух веб-серверах.

Полные инструкции:

  1. Удаленный рабочий стол на сервере LIVE1, откройте IIS Mgr, нажмите на проблемный сайт и выберите Дополнительные настройки на боковой панели.
  2. Измените идентификатор на что-то уникальное, например, 10. Нажмите OK.
  3. Перезапустите веб-сервис ( c:\windows\system32\iisreset /restart)

Сделайте то же самое для LIVE2 (убедитесь, что идентификатор сайта такой же, как на LIVE1)

Обратите внимание, что идентификатор сайта влияет на расположение файлов сайта, например, папка файла журнала станет, C:\inetpub\logs\LogFiles\W3SVC10например.

Отметим также , что вы могли бы сделать эти изменения вручную путем редактирования сайта ID атрибута в IIS файл конфигурации на каждом сервере: C:\Windows\System32\inetsrv\config\applicationHost.config. Требуется администраторская привилегия и все еще требуется сброс после этого.

Джеймс МакКормак
источник

Ответы:

11

Судя по вашему вопросу, кажется, что у вас есть центральный сервер состояния сеанса (DB?), Который отслеживает данные сеанса?

Вы также должны синхронизировать машинный ключ, который используется для шифрования для проверки подлинности любых форм и т. Д. Для работы. Это также может повлиять на идентификацию сеанса, я не уверен.

Настройка машинных ключей в IIS 7

Кроме того, вы должны использовать общую конфигурацию между машинами, это может само по себе решить проблему с разными ключами машины.

Синхронизация конфигурации IIS для фермы веб-серверов?

РЕДАКТИРОВАТЬ: Когда вы изменили идентификатор сайта, вы пытались перезапустить диспетчер IIS, чтобы увидеть, изменился ли webroot? Возможно, конфигурация связана с идентификатором, что означает, что изменение идентификатора также изменяет такие вещи, как корень документа и т. Д.

Jishi
источник
Спасибо за идеи, Jishi, но я уже синхронизировал machineKey в web.configs. Я думаю, что я действительно ищу способ изменения ID экземпляра IIS сайта без необходимости полного удаления и перенастройки сайтов на веб-серверах.
Джеймс МакКормак
Когда вы изменили идентификатор сайта, пытались ли вы перезапустить диспетчер IIS, чтобы увидеть, изменился ли webroot? Возможно, конфигурация связана с идентификатором, что означает, что изменение идентификатора также изменяет такие вещи, как корень документа и т. Д.
jishi
1
Да, это было это! Я забыл перезапустить службу IIS (командная строка iisreset / restart). После этого все заработало! Пожалуйста, обновите ваш ответ этой информацией, и я дам вам принятый ответ.
Джеймс МакКормак,
Сделка сделана Рад, что это сработало для вас.
Джиши