Можно ли переименовать переменную сеанса, когда сеанс хранится в базе данных? - PullRequest
0 голосов
/ 22 января 2019

У нас есть приложение 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, так что я почти уверен, что причина была.

Мой вопрос: есть ли способкогда-нибудь вносить изменения в этот класс или любые другие переменные сеанса, не выбивая всех пользователей из приложения, удаляя их сеансы?

...