MVC3 .NET Session случайно теряет значение сессии и возвращается как null

У меня производственная проблема с состоянием сеанса In-Proc.

Наше приложение основано на фреймворке MVC 3 .NET и интегрировано в наш сайт под управлением Sitecore CMS.

Наши пользователи сталкиваются с проблемой "Object reference not set to an instance of an object" случайным образом во всем потоке приложения.

После тщательного протоколирования и трассировки мы пришли к выводу, что это происходит, когда объект сессии возвращает null.

Вот некоторые подробности о том, что мы обнаружили и что нам известно.

  1. ID сессии сохраняется для одного и того же пользователя и передается по всему путь в приложение правильно.
  2. Я не думаю, что это проблема кода, потому что это происходит только на продакшене в случайный интервал времени, никогда не происходит на локальной, dev или staging среде.
  3. Есть два производственных сервера, работающих через балансировщик нагрузки.
  4. Это не постоянная проблема сервера, так как мы проверили, отключив один из серверов и направив весь трафик на один сервер. Также через логи мы смогли определить, что пользователи обращаются к одному и тому же серверу, но сессия стала нулевой.
  5. Похоже, что это не проблема клиента, так как он может успешно пройти через приложение, даже если ранее столкнулся с ошибкой.
  6. Не похоже, что это проблема нагрузки на трафик или сервер, потому что это происходит в течение дня в случайное время, и происходит со случайными пользователями.
  7. Не похоже, что это вызвано переработкой пула приложений.
  8. Не похоже, что это вызвано таймаутом сессии, так как мы установили таймаут на два часа, и пока мы отслеживаем журнал, пользователи могут испытывать это 5-10 минут в потоке.

Примечание: Мы должны использовать состояние сессии In-Proc из-за нашей Sitecore CMS. Поэтому изменение дизайна - не вариант.

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

Несколько мест, где мы часто видим возникновение этой проблемы в нашем приложении, это когда пользователи перенаправляются javascript (windows.location).

И в местах, где выполняются асинхронные вызовы ajax.

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

Спасибо

Добавлено примечание:

@Mystere && @H27Studio, Я также обнаружил кое-что, связанное с sessionID или проблемами сброса сессии. В некоторых случаях мы обнаружили, что при перенаправлении страницы происходит два дублирующих вызова метода GETS, при этом в первом вызове отсутствует sessionID и происходит случайное перенаправление на один из серверов (Это происходит потому, что серверная постоянная сессия от балансировщика нагрузки основана на IP клиента, sessionID и другой информации заголовка для создания уникальной сессии, чтобы держать клиента на одном сервере). Это происходит каждый раз во время потока, когда наша страница перенаправления использует window.location.

Это вызовет проблему "Object reference not set..." для клиента, если плохой вызов без sessionID попадет на тот же сервер. (Возможно, это происходит потому, что первый неудачный вызов с отсутствием sessionID заставляет приложение создавать новую сессию, которая переопределяет объект исходной сессии) Поэтому даже при втором вызове, когда в приложение передается правильный sessionID, мы обнаружим, что объект сессии содержит null.

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

У кого-нибудь есть подсказки по этому поводу? Thanks

Update: Мы планируем предпринять следующие шаги в надежде решить эту проблему.

  1. У нас есть проблемы в областях, где были сделаны вызовы Async Ajax, поэтому мы планируем удалить функцию Async и позволить Ajax работать синхронно.
  2. У нас есть проблемы, когда происходит javascript-перенаправление Windows.location. Мы создали альтернативный метод с использованием postback в надежде устранить проблему в этой области.
  3. Другие области, которые не связаны ни с одной из вышеперечисленных проблем, все еще находятся в процессе решения.

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

Спасибо за все комментарии.

7
задан Jun Zheng 29 September 2012 в 00:13
поделиться