Asp.net, stateserver, NLB, сессия потеряна

1-й пост о stackoverflow, надеюсь на отличную обратную связь :)

В настоящее время я пытаюсь сбалансировать нагрузку на наш веб-сайт. Мы настроили 2 кластера NLB на сервере Windows 2003 с IIS 6.

При тестировании настройки я обнаружил, что иногда наша сессия теряется. Полтора дня спустя вот результат:

  1. Да, у нашего machine.config один и тот же ключ шифрования / дешифрования.
  2. Да, идентификаторы в iis metabase.xml одинаковы для обоих компьютеров. Собственно, весь файл такой же, за исключением "AdminACL".
  3. Оба веб-приложения настроены с помощью «StateServer» и оба указывают на один и тот же компьютер.

С этого момента поиск в Google дает меньше информации и возможных решений.

Насколько мне известно, нет определенной закономерности, вызывающей эту проблему. Это случается время от времени.

Пытаясь найти проблему, я заметил, что запрос отправил на сервер файл cookie идентификатора сеанса asp, но сервер не сопоставил его с сеансом пользователя.

Таким образом, запрос номер x был отправлен от клиента, с файлом cookie был сопоставлен сеанс, и все прошло гладко. Номер запроса x + 1 был отправлен от клиента с файлом cookie, но сеанс не был найден.

Оба запроса были сделаны на одной машине в NLB.

Вот фрагмент asp trace.axd:

1-й запрос:

Детали запроса Идентификатор сеанса: j2ffvy45updpc52uhw1mbg55 Тип запроса: GET Время запроса: 26.11.2008 14:58:06 Код состояния: 200 Кодировка запроса: Unicode (UTF-8) Кодировка ответа: Unicode (UTF-8)

Запросить сбор файлов cookie

Имя Значение Размер

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 ПОМОЩЬ 22 9

Сбор файлов cookie ответа

Имя Значение Размер

Коллекция заголовков

Имя Значение

Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

2-й запрос:

Детали запроса Идентификатор сеанса: Тип запроса: POST Время запроса: 26.11.2008 14:58:08 Код состояния:
Кодировка запроса: Unicode (UTF-8) Кодировка ответа:

Запросить сбор файлов cookie

Имя Значение Размер

Сбор файлов cookie ответа

Имя Значение Размер

Коллекция заголовков Имя Значение Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

Как вы можете видеть во втором запросе, файл cookie отправляется клиентом, но asp, похоже, никогда не добавляет файлы cookie в свой «Запрос коллекции файлов cookie». Думаю, поэтому не находит сеанс.

Итак, почему файл cookie не привязан к сеансу? Это проблема? Проблема в другом?

Не стесняйтесь спрашивать любые разъяснения.

Спасибо всем за отзывы.

JF

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 506
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Не совсем ответ на ваш вопрос, но пробовали ли вы использовать хранилище сеансов на основе sql-сервера? (Ищите в MSDN постоянный сценарий, а не временный сценарий, поставляемый с asp.net)

Я слышал «плохие вещи» об исполняемой службе сеанса и, следовательно, не использовал ее. Однако никогда не было проблем с веб-фермерством с решением на основе sql-сервера.

Извините, это не совсем ответ на вашу проблему, но он должен либо (а) исправить, либо (б) значительно сузить ее.

Что ж, если вы используете Visual Studio, вы можете хотя бы протестировать ее с помощью MSDE (урезанная версия SQL Server, которая поставляется с Visual Studio) ...

Это может помочь исключить проблемы с государственным сервером ...

Использование подхода базы данных имеет свои проблемы. Я думаю, вы сможете использовать свой предпочтительный подход.

Может, статья об устранении неполадок в этой сессии поможет?

Или "Устранение проблем, связанных с сеансом, в ASP.NET"

Или "Устранение неполадок с истекшим состоянием сеанса ASP.NET и вашими параметрами"

Я буду хромым и повторю предложение MS SQL Server. Установите SQL Server Express, который полностью бесплатен, в том числе для коммерческого использования, и у него есть только три недостатка, которые не должны быть проблемой для вас на этом этапе:

  • Максимальный размер базы данных 4 ГБ
  • Используется не более 1 ядра ЦП
  • Используется не более 1 ГБ ОЗУ

Несколько моментов, которые следует принять во внимание:

  • Какая нагрузка на ваш сайт? Сервер состояний имеет тенденцию аварийно завершать работу при большом количестве одновременных попаданий. Мы используем его только в сценариях, где у нас действительно небольшое количество пользователей (в десятках, в основном серверные системы). Всякий раз, когда мы пытались использовать его в производственной среде для сайтов, ежедневно обслуживающих тысячи пользователей, он вылетал из строя, что приводило к потере данных сеанса.
  • В одной из производственных сред, которыми мы управляем, мы используем MSSQL 2005 Express для управления сеансами, на сайте более 10 тысяч пользователей в день и более 200 тысяч страниц в день. Это рекомендуемый подход в случае, если сеанс является обязательным и тесно связан с вашим приложением.

Если вы собираетесь использовать MSSQL Express в качестве базы данных состояния, помните, что он не поставляется с агентом SQL Server, что означает, что планировщик задач не работает в фоновом режиме и не очищает истекшие сеансы. Я бы рекомендовал найти планировщик и периодически запускать чистую хранимую процедуру сеансов с истекшим сроком.

Удачи

Вместо того, чтобы возиться с SQL, отправьте свои тесты прямо в один из узлов IIS, чтобы проверить, возникает ли у вас та же проблема. Я уверен, что если вы проведете лишь небольшое количество тестов, StateServer не будет проблемой.

Попробуйте установить доменное имя asp.net_sessionid с помощью кода на ".yourdomain.com". По умолчанию для доменного имени файла cookie ASP.net_SessionID задан полный путь к приложению. Итак, это может быть одной из причин, по которой cookie не перемещается.

Например. Request.Cookies ["ASP.NET_SessionId"]. Domain = ".yourdomain.com". Помните первый "." важно в доменном имени.

Вы можете сделать это в HttpModule в событии AcquireRequestState.

Ответ принят как подходящий

Я наконец нашел ответ на свою проблему. Его происхождение находится в коде приложения (например, 99% ошибок сторонних инструментов программиста). Я все равно решил выложить его на случай, если кто-то окажется в подобном сценарии.

Этот код был частью класса WebServiceRequester. Класс инициатора запроса веб-службы был создан при создании сеанса и сохраняется в сеансе. Во время создания мы инициализируем член m_webServiceURL, и этот член сохраняется в сессии после. Значение, при котором был инициализирован этот член, зависело от настройки на локальном компьютере.

Важная часть заключается в следующем: Класс WebServiceRequester содержит объекты WebService. Объекты WebService не могут быть сохранены в сеансе, они не сериализуемы в asp. Свойство имеет атрибут [NonSerialized]. Поэтому каждый раз, когда мы обращались к свойству WebService объекта первым в течение жизненного цикла страницы, нам приходилось создавать новый и назначать ему URL-адрес m_webServiceURL, который был сохранен в сеансе. Итак, вы видите, новый объект веб-службы, возможно, на другой машине, что означает разные настройки на каждой машине.

Итак, вот что произошло: поле 29 было настроено для доступа к веб-службе на локальном хосте

поле 30 было настроено для доступа к веб-службе как 192.168.253.29.

Технически они оба установлены на одной машине. Но вот сценарий:

войдите в поле 29. m_webServiceURL установлен на localhost в сеансе.

[просьба в графе 29 здесь]

Балансировка NLB приводит нас к блоку 30. box 30 загружает сеанс, создает новый объект веб-службы с localhost в качестве адреса веб-службы. коробка 30 отправила запрос к неправильной веб-службе, что привело к исключению Session Expired.

Одна из проблем во время отладки заключалась в том, что локальные коммуникации не записывались сетевым монитором.

Что привело меня к трассировке, так это то, что у нас никогда не регистрировалось исключение в трассировке журнала ящика 29, как должно быть.

Спасибо за ваши предложения всем, это было действительно оценено.

Хорошего дня. JF

Другие вопросы по теме