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