
Мне поручили разобраться с проблемой, когда сеанс пользователя меняется между обновлениями страницы. Я сразу же (ничего не зная о веб-сайте) сказал, что это похоже на проблему балансировки нагрузки/конфигурации веб-кластера. Однако позже я узнал, что нагрузка на веб-сайте не сбалансирована — это один сервер.
Приложение имеет объект Basket, который хранится в Session. Пользователь добавляет элементы в корзину и т. д. Находясь на странице корзины, если страница обновляется, элементы, которые находятся в корзине, меняются, а иногда их вообще нет.
Сессия не теряется, она почти всегда восстанавливается при следующем обновлении, но затем корзина может быть пустой или иметь другой контент при следующем обновлении. Я видел такое поведение много раз, но только в многосерверных настройках.
Мы пытались воспроизвести эту проблему в среде разработки, но безуспешно — мы просто не можем ее воспроизвести, но в реальных условиях она встречается часто.
Веб-приложение представляет собой сайт ASP.NET WebForms, работающий под управлением .NET 4.0 на Windows Server 2008 R2 и IIS 7.5.
Режим состояния сеанса — InProc, а время ожидания сеанса установлено на 480 минут.
Я использовал fiddler для просмотра запросов и ответов, и идентификатор сеанса ASP.NET, передаваемый на сервер, каждый раз один и тот же. Похоже, что между ответами нет никакой разницы, кроме фактического возвращаемого HTML.
Есть ли у кого-нибудь идеи, что может быть причиной этой проблемы?
Обновление 1:
Я переработал часть регистрации, которую коллега реализовал в коде корзины. Теперь я вижу, что идентификатор сеанса остался прежним, значение переменной сеанса также осталось прежним, хотя отображаются другие данные.
Извините, мне следовало проверить их журналы, прежде чем публиковать это.
Я убежден, что это проблема сервера, хотя в нашей тестовой среде код работает так, как и ожидалось.
решение1
«Я сказал, что это похоже на проблему балансировки нагрузки/конфигурации веб-кластера. Однако позже я узнал, что нагрузка на веб-сайте не сбалансирована — это один сервер».
Тот факт, что это один сервер, не означает, что не происходит балансировки нагрузки. В IIS есть функция, называемая «Web Garden», которая разделяет веб-работу на несколько процессов, так что ее можно распределить по нескольким ЦП.
Это что-то вроде небольшой «веб-фермы» — отсюда и название «Веб-сад». :)
Эффект при использовании Web Garden заключается в том, что переменные сеанса InProc перестают работать правильно, так как вы можете оказаться в другом рабочем процессе при каждом запросе страницы. InProc (In Process) работает надежно только в том случае, если вы всегда оказываетесьв том же процессе.
Решение 1:
- Убедитесь, что IIS не настроен на использование Web Garden. Для этого:
- Откройте диспетчер IIS.
- Определите, какой пул приложений использует ваше веб-приложение.
- Щелкните правой кнопкой мыши по своему пулу приложений и выберите «Расширенные свойства".
- Прокрутите вниз и установите "Максимальное количество рабочих процессов" к
1
.
Решение 2:
- Используйте сервер состояний сеансов, единственной задачей которого является управление состояниями сеансов для всех рабочих процессов.
- Затем измените веб-приложение с InProc на StateServer.
- ПроверитьНастройка сервера состояний для поддержания состояния сеанса (IIS 7)чтобы начать с этого. :)
Посетите этот блог MSDN:Внутрипроцессное управление состоянием сеанса
В нем описываются параметры состояния сеанса и способы устранения неполадок, связанных с потерей сеанса InProc.
решение2
Я давно не менял код. (последнее изменение: 20 июля 2016 г.)
Но у меня та же проблема в Windows Server 2016. Мой клиент обновил Windows 2012 R2 до Windows 2016. Я не смог решить эту проблему.
Затем я перешел на старый сервер (windows 2012 r2). Моя проблема была решена. Я думаю, что это ошибка, но я не уверен
Может быть, это вам поможет.