2008-11-26 3 views
2

1-й пост на StackOverflow, надеется иметь большую обратную связь :)asp.net, StateServer, NLB, сессия потеряла

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

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

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

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

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

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

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

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

Вот отрывок из осины Trace.axd:

первый запрос:

Запрос детали Id Session: j2ffvy45updpc52uhw1mbg55 Тип запроса: GET Время запроса: 11/26/2008 2:58: 6 вечера Код состояния: 200 Запрос Кодировка: Unicode (UTF-8) Кодирование Ответ: Unicode (UTF-8)

Запрос Печенье Коллекция

Название Значение Размер

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 AID 22 9

Response Печенье Коллекция

Наименование Значение Размер

Headers Коллекция

Название Значение

Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

второй запрос:

Запросить информацию Id Session: Тип запроса: POST Время запроса: 11/26/2008 2:58:08 PM Статус Код:
Запрос Кодировка: (UTF-8) Ответ Кодировка:

Заказать Печенье Коллекция

Наименование Значение Размер

Response Печенье Коллекция

Наименование Значение Размер

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

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

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

Не стесняйтесь спрашивать о других предупреждениях.

Благодарим вас за отзыв.

JF

ответ

1

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

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

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

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

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

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

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

[некоторые запросы на поле 29 здесь]

NLB балансирующих приблизят нас на коробке 30. коробки 30 загружает это заседание, создать новый WebService obect с локальным хостом в качестве адреса веба-службы. В поле 30 сделан запрос на неправильный веб-сервис, приводящий к исключению Session Expired.

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

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

Благодарим вас за предложения, все были очень благодарны.

Удачного дня. JF

0

Не совсем ответ на ваш вопрос, но вы пробовали его с помощью SQL-сервера на основе сеанса магазин? (Поиск в MSDN для постоянного скрипта, а не временного скрипта, который предоставляется с asp.net)

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

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

0

Ну, если вы используете Visual Studio, вы могли бы по крайней мере, проверить его с MSDE (урезанной версией SQL Server, который поставляется с Visual Studio) ...

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

0

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

    база размер
  • Max 4GB
  • Max 1 CPU Ядро используемых
  • Max 1GB RAM используется
0

несколько моментов, чтобы принять во внимание:

  • Что Лоа d на вашем сайте? State Server имеет тенденцию к сбою при столкновении с большим количеством одновременных ударов. Мы используем его только в сценариях, где у нас действительно небольшое количество пользователей (в 10-х, в основном, бэкэнд-системах). Всякий раз, когда мы пытались использовать его в производстве для сайтов, ежедневно обслуживающих 1000 пользователей, это может привести к сбою, что приведет к потере данных сеанса.
  • В одной из производственных сред, которыми мы управляем, мы используем MSSQL 2005 Express для управления сеансами, на сайте 10K + пользователей в день и 200K + страниц в день. Это рекомендуемый подход, если сеанс является обязательным и тесно связанным с вашим приложением.

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

Успехов

0

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

0

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

E.g. Request.Cookies ["ASP.NET_SessionId"]. Domain = ".yourdomain.com". Помните о первом "." имеет важное значение в доменном имени.

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