У меня производственная проблема с состоянием сеанса In-Proc.
Наше приложение основано на платформе MVC 3 .NET и интегрировано в наш сайт под управлением Sitecore CMS.
Наши пользователи случайно сталкивались с тем, что «Ссылка на объект не установлена для экземпляра объекта» в процессе приложения.
После обширного ведения журнала и трассировки мы можем заключить, что это было вызвано тем, что объект сеанса возвращает ноль.
Вот некоторые подробности о том, что мы нашли и что мы знаем.
- Идентификатор сеанса является постоянным для того же пользователя и передал все
путь в приложение правильно.
- Я не верю, что это проблема с кодом, потому что это происходит только в производстве с произвольным интервалом, никогда не происходит в локальной, dev или промежуточной среде.
- Есть два рабочих сервера, работающих через балансировщик нагрузки.
- Не является постоянной проблемой сервера, как мы тестировали, спя один из серверов и имея весь трафик на один сервер. Также с помощью регистрации мы могли определить, что пользователь подключается к тому же серверу, но сеанс стал нулевым.
- Похоже, что это не проблема клиента, потому что они могут успешно пройти приложение, даже если они уже сталкивались с ошибкой.
- Кажется, это не проблема загрузки трафика или нагрузки на сервер, потому что это происходит в течение дня в случайное время и происходит со случайными пользователями в течение.
- Кажется, это не вызвано переработкой пула приложений.
- Это, по-видимому, не вызвано тайм-аутом сеанса, так как мы установили тайм-аут на два часа, и пока мы отслеживаем журнал, пользователи могут испытать эти 5-10 минут в потоке.
Примечание: мы должны использовать состояние сеанса In-Proc из-за нашей CMS Sitecore. Так что изменение дизайна не вариант.
У меня есть теория, что это может быть связано с блокировкой сеанса или повреждением при одновременных попытках доступа.
В некоторых случаях мы часто наблюдаем возникновение этой проблемы в нашем приложении, когда пользователи перенаправляются с помощью JavaScript (windows.location).
И в областях, где выполняются асинхронные вызовы ajax.
Мы какое-то время ломали голову над этим, мне интересно, есть ли у кого-нибудь понимание или теория, в чем может быть проблема?
Спасибо
Добавлено примечание:
@ Mystere && @ H27Studio, поэтому я также обнаружил кое-что, связанное с sessionID или проблемами сброса сеанса. В некоторых случаях мы обнаруживаем, что при перенаправлении страницы он вызывает два повторяющихся вызова GETS к методу, при первом вызове пропускается sessionID, и случайным образом перенаправляется на один из серверов (это происходит потому, что постоянный сеанс сервера от балансировщика нагрузки основываться на IP-адресе клиента, sessionID и другой информации заголовка, чтобы создать уникальный сеанс для хранения клиента на одном сервере. Это происходит каждый раз во время потока, когда наша страница перенаправления использует window.location.
Это вызовет проблему "Ссылка на объект не установлена .." для клиента, если плохой, без вызова sessionID попадет на тот же сервер. (Вероятно, это связано с тем, что первый неправильный вызов без идентификатора сеанса приводит к тому, что приложение создает новый сеанс, который переопределяет объект исходного сеанса). Таким образом, даже при втором вызове, когда правильный идентификатор сеанса передается в приложение, мы обнаружим, что объект сеанса содержит ноль .
Так что я полагаю, что есть проблема с дублирующим вызовом, который очищает объект сеанса, который не уверен, почему или с чем это вызвано.
Кто-нибудь знает об этом? Спасибо
Обновление:
Мы планируем предпринять эти шаги в надежде решить эту проблему.
- У нас есть проблемы в областях, где были сделаны вызовы Async Ajax, поэтому мы планируем удалить функцию Async и позволить ей работать синхронно Ajax.
- У нас есть проблемы, когда происходит перенаправление JavaScript в Windows.location. Мы создали альтернативный метод с использованием обратной передачи в надежде исправить проблему в этой области.
- Другие области, которые не связаны с одной из вышеупомянутых проблем, все еще находятся в воздухе.
Эффект от изменений будет опубликован после того, как мы развернем его в производство.
Спасибо за все комментарии.