У нас есть приложение MVC, которое в значительной степени полагается на хранение вещей в сеансе (не мой дизайн).Это приложение сбалансировано между двумя серверами.В тесте у нас только один сервер.Мы сохраняем сеанс пользователя в базе данных, чтобы предотвратить запуск пользователей во время развертываний. Это приложение высокой доступности, поэтому чем меньше прерываний, тем лучше.
Одна из вещей, которые мы храним в сеансе, - это экземпляркласс.Давайте назовем класс Foo:
public class Foo
{
public int Bar { get; set; }
}
Я пытался провести рефакторинг некоторого кода и в итоге переименовал Bar в BarId, чтобы его назначение было более понятным.Все выглядело хорошо в разработке и тестировании.Однако когда мы начали развертывание в производство, пользователи начали получать исключения с нулевой ссылкой.Ошибка произошла в строке кода, которая извлекает Foo из сеанса.Код выглядит примерно так:
If(Session["foo"] != null)
{
var foo = (Foo)Session["foo"];
using(var context = new BarContext())
{
_barRepo = new GenericRepository<Bar>(context);
_bar = _barRepo.GetById(foo.Bar);
}
}
В итоге получилось так, что, хотя Session["foo"]
не был нулевым, он был неудачно преобразован в объект типа Foo, таким образом, foo был нулевым.Причина, по которой это преобразование не удалось, заключается в том, что у объекта сеанса все еще был член Bar вместо члена BarId, который был теперь в классе Foo.
Это было очень трудно проверить, но проблема была решена, когда я назвал BarId обратно в Bar, так что я почти уверен, что причина была.
Мой вопрос: есть ли способкогда-нибудь вносить изменения в этот класс или любые другие переменные сеанса, не выбивая всех пользователей из приложения, удаляя их сеансы?