Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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


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

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

Полная инструкция:

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

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

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

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

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

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

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

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

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

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