Периодически возвращаются неверные данные сеанса ASP.NET

Периодически возвращаются неверные данные сеанса ASP.NET

Мне поручили разобраться с проблемой, когда сеанс пользователя меняется между обновлениями страницы. Я сразу же (ничего не зная о веб-сайте) сказал, что это похоже на проблему балансировки нагрузки/конфигурации веб-кластера. Однако позже я узнал, что нагрузка на веб-сайте не сбалансирована — это один сервер.

Приложение имеет объект 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. Для этого:
    1. Откройте диспетчер IIS.
    2. Определите, какой пул приложений использует ваше веб-приложение.
    3. Щелкните правой кнопкой мыши по своему пулу приложений и выберите «Расширенные свойства".
    4. Прокрутите вниз и установите "Максимальное количество рабочих процессов" к 1.

Настройки пула приложений

Решение 2:

Посетите этот блог MSDN:Внутрипроцессное управление состоянием сеанса

В нем описываются параметры состояния сеанса и способы устранения неполадок, связанных с потерей сеанса InProc.

решение2

Я давно не менял код. (последнее изменение: 20 июля 2016 г.)

Но у меня та же проблема в Windows Server 2016. Мой клиент обновил Windows 2012 R2 до Windows 2016. Я не смог решить эту проблему.

Затем я перешел на старый сервер (windows 2012 r2). Моя проблема была решена. Я думаю, что это ошибка, но я не уверен

Может быть, это вам поможет.

Связанный контент