Сессии и хранение объектов - PullRequest
1 голос
/ 20 декабря 2010

Если вернуть объект из сеанса (HttpContext.Current.Session) частному члену типа объектов, а затем изменить его, например, Вы переименовываете атрибут или добавляете что-то к члену внутреннего списка объектов. Сохраняются ли эти изменения, если на другой странице вы запрашиваете тот же объект из сеанса ... будет ли он обновлен значениями, обновленными на предыдущей странице. Другими словами, объект сохраняется, или вам нужно повторно сохранить объект обратно в сеанс, как только вы что-то измените на каждой странице. Буду признателен за любую оказанную помощь. Спасибо

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Если вы измените экземпляр, который хранится в состоянии сеанса, экземпляр будет изменен.
Если вы измените копию экземпляра, оригинал не будет затронут.(если копия не ссылается на оригинал и не обновляет его, что маловероятно)

2 голосов
/ 20 декабря 2010

Если это фактический объект, тогда да, вы изменяете версию, поддерживаемую сеансом, и ее значения будут сохранены.

Если это не ссылочный тип, такой как String, то вы должны ссылаться на фактическое значение сеанса, чтобы изменить его (то есть: сеанс ["ключ"] = значение).

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

Из-за того, как это работает, вы должны помещать в сеанс только те значения, которые вам действительно нужны по всему сайту.

Прежде чем даже подумать о том, чтобы заняться чем-то сессией, я спрашиваю себя:

  1. Это что-то нужно для всего сайта или близко к нему?
  2. Время загрузки этой информации прямо из базы данных по мере необходимости больше, чем извлечение ее из памяти веб-серверов?
  3. Сбалансирована ли нагрузка на этот объект или в будущем возможна балансировка нагрузки?

Если 1 - да, тогда использование сеанса - "возможно"
Если 2 - это да, тогда сессия также может быть, но я бы, вероятно, использовал другой механизм кэширования.
Если 3 - «да», то я вообще не использую сессию (и полностью отключаю ее). Для балансировки нагрузки требуется сервер состояния сеанса, который обычно является сервером SQL. Это возвращает нас к первоначальной проблеме с сессией: значения загружаются и сохраняются для каждого запроса страницы.

1 голос
/ 20 декабря 2010

Хотя вы могли бы проверить это для себя очень легко, ответ - да - объект будет сохранен!

Объекты, хранящиеся в словаре сеансов, хранятся по ссылке, поэтому это означает, что при изменении внутренних свойств или структуры объекта (т. Е. При сохранении объекта List <> и добавлении или удалении элементов) эти изменения будут сохранены .

При этом, если вы храните тип значения, такой как Int32 или Boolean, то если вы изменяете значение, вам нужно специально установить его для Session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...