Назад | Перейти на главную страницу

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

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

В приложении есть объект Basket, который хранится в Session. Пользователь добавляет товары в корзину и т. Д. На странице корзины, если страница обновляется, элементы, находящиеся в корзине, меняются, а иногда их нет.

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

Это то, что мы безуспешно пытались воспроизвести в среде разработчика - мы просто не можем воспроизвести проблему, но вживую это происходит часто.

Веб-приложение - это сайт ASP.NET WebForms, работающий под .NET 4.0 в Windows Server 2008 R2 и IIS 7.5.

Режим состояния сеанса - InProc, а тайм-аут сеанса установлен на 480 минут.

Я использовал скрипач для просмотра запросов и ответов, и идентификатор сеанса ASP.NET, передаваемый на сервер, каждый раз один и тот же. Похоже, что нет никакой разницы между ответами, кроме фактического возвращенного HTML.

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

Обновление 1:

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

Извините, я должен был проверить их записи перед публикацией.

Я убежден, что это проблема сервера, но в нашей тестовой среде код работает должным образом.

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

Тот факт, что это один сервер, не означает, что балансировки нагрузки не происходит. В IIS есть функция под названием «Веб-сад», которая разделяет веб-работу между несколькими процессами, чтобы ее можно было распределить между несколькими процессорами.

Это похоже на небольшую «Веб-ферму» - отсюда и название «Веб-сад». :)

Эффект от использования веб-сада заключается в том, что из-за этого переменные сеанса InProc перестают работать правильно, поскольку вы можете оказаться в другом рабочем процессе при каждом запросе страницы. InProc (в процессе) работает надежно только в том случае, если вы всегда в том же процессе.

Решение 1:

  • Убедитесь, что IIS не настроен на использование веб-сада. Сделать это:
    1. Откройте диспетчер IIS.
    2. Определите, какой пул приложений используется вашим веб-приложением.
    3. Щелкните правой кнопкой мыши пул приложений и выберите "Дополнительные свойства".
    4. Прокрутите вниз и установите "Максимум рабочих процессов"чтобы 1.

Решение 2:

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

В нем описаны параметры состояния сеанса и способы устранения потери сеанса InProc.

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

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

Затем я перехожу на старый сервер (Windows 2012 R2). Моя проблема была решена. Я думаю, что это ошибка, но я не могу быть уверен

Может тебе это поможет.