Технически ASP.NET также никогда не поддерживал это.Это была случайность, которая просто работала при использовании сессий InProc (то есть в памяти), благодаря тому, как хранилище сессий работало в этом случае.Если бы вы использовали альтернативное хранилище сеансов, такое как SQL Server, вам также пришлось бы сериализовать / десериализовывать объекты в и из сеанса.ASP.NET Core отличается только тем, что использует обобщенное хранилище сеансов, поэтому он принудительно сериализует / десериализует любой объект, даже если вы используете хранилище в памяти.
Тем не менее, ваша проблема здесьчто вы просто не сохраняете свои изменения обратно.Опять же, вы полагались на случайное поведение.Поскольку ASP.NET непосредственно сохранял объект в памяти, выполнение операций над этим объектом автоматически «сохранялось», поскольку это была та же ссылка.При десериализации вы создаете новый экземпляр, поэтому операции не будут продолжаться до тех пор, пока вы не сериализуете объект обратно в сеанс.
Наконец, веб-формы или нет, это было никогда рекомендуетсяили даже правильный способ сделать вещи.Хранилище сессий является энергозависимым.Это не предназначено для чего-либо кроме кратковременного (и ненадежного) постоянства.Другими словами, вы никогда не можете рассчитывать на что-то находящееся в сеансе, поэтому вы всегда должны защищать код вокруг случая, когда данные не существуют.Если вы зависите от того, что там есть, как это звучит, как здесь, то вы всегда настраивали себя на неудачу.
Однако, если вы делаете что-то вроде многошаговой формы,допустимо, чтобы отдельные шаги входили в сеанс, хотя на самом деле следует использовать TempData
вместо Session
для этого.На последнем этапе, однако, ваш составной объект должен быть сохранен в чем-то вроде SQL Server, а не в сеансе.Практически во всех других случаях вы должны просто сохранить что-то вроде SQL Server и полностью избегать Session
.