Мне дали задание разобраться в проблеме, при которой сеанс пользователя изменяется между обновлениями страницы. Сразу (ничего не зная о веб-сайте) я сказал, что это похоже на проблему с балансировкой нагрузки / конфигурацией веб-кластера. Однако позже я узнал, что на сайте нет балансировки нагрузки - это один сервер.
В приложении есть объект 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:
1
.Решение 2:
Посмотрите этот блог MSDN: Управление состоянием сеанса в процессе
В нем описаны параметры состояния сеанса и способы устранения потери сеанса InProc.
Код давно не менял (последнее изменение: 20 июля 2016 г.)
Но у меня такая же проблема с Windows Server 2016. Мой клиент обновлял Windows 2012 R2 до Windows 2016. Я не смог решить эту проблему.
Затем я перехожу на старый сервер (Windows 2012 R2). Моя проблема была решена. Я думаю, что это ошибка, но я не могу быть уверен
Может тебе это поможет.