Зачем вам когда-либо использовать объект хранилища asp.net ViewState поверх объекта хранилища сеанса?

Помимо того, что хранилище сеансов является глобальным для нескольких страниц, зачем вам когда-либо использовать состояние просмотра для хранения значений?

Кажется нелепым отправлять любую информацию, кроме нескольких небольших строк запроса, таких как значения, от клиента к серверу и обратно. Я имею в виду, какая трата полосы пропускания (!) Просто для хранения. Сессия, хотя и глобальна на нескольких страницах, кажется совершенно превосходной альтернативой состоянию просмотра.

В частности, с элементами управления asp.net и вариантами ajax, состояние просмотра может быстро стать раздутым, отслеживая различные состояния и переменные всех этих различных элементов управления и элементов html.

Но тогда почему вообще существует хранилище состояний просмотра для переменных и объектов страницы?

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

Спасибо за чтение!

РЕДАКТИРОВАТЬ: У всех был отличный ответ, извините, если я не выбрал ваш.


person Mark Rogers    schedule 22.02.2009    source источник


Ответы (8)


Сессии заканчиваются, Viewstate - нет - вы можете вернуться через час, и ваше состояние просмотра будет по-прежнему доступно. Состояние просмотра также постоянно доступно при переходе назад / вперед по веб-сайту, при изменении сеанса.

person Mark S. Rasmussen    schedule 22.02.2009
comment
Кроме того, сеансы в основном представляют собой пары «ключ-значение»: если ваш пользователь открывает несколько вкладок, а вы сохраняете идентификатор в сеансе, у вас могут возникнуть проблемы. - person chris; 19.07.2011

Вся причина Viewstate или Session заключается в том, чтобы превратить Интернет из системы без отслеживания состояния в динамический, индивидуальный интерфейс. Когда пользователь запрашивает страницу, единственный способ возобновить работу с того места, где пользователь остановился, - это запомнить состояние либо на сервере, либо на клиенте пользователя.

Viewstate - это механизм запоминания состояния пользователя на клиенте. Сессия - это механизм запоминания состояния пользователя на сервере.

Viewstate - это временный механизм хранения. Состояние элементов управления, использующих viewstate, отображается на странице html как скрытый ввод. Во избежание подделки он подписан. Однако он не зашифрован, поэтому вы, вероятно, не захотите помещать в него НИЧЕГО конфиденциального. Viewstate полезен в ситуациях, когда вы хотите публиковать серию нескольких запросов (загрузка страницы). Примером этого является случай, когда форма не проверяется, потому что, возможно, пользователь ввел неверный адрес электронной почты или что-то в этом роде, и вы хотите восстановить форму в том виде, в котором она была до отправки пользователем. Недостатком этого является то, что viewstate - голодный зверь и может легко увеличить размер страницы на 30-50%.

Сессия же хранится на сервере. Клиент получает токен, который сообщает серверу, какой блок памяти принадлежит им. Это может быть намного безопаснее, чем viewstate, потому что данные не передаются пользователю снова и снова. Однако есть компромиссы. Вашему серверу может не хватить памяти. Или пользователь может потерять данные, если его сеанс будет прерван.

Как правило, не существует "правильного" ответа, на котором можно было бы использовать. Все дело в том, чего вы пытаетесь достичь.

Для большинства операций с элементами управления следует использовать Viewstate. Если вы имеете дело с конфиденциальной информацией, подумайте о сеансе. Если у вас есть данные для определенного набора страниц, используйте viewstate. Если это данные, которые вам понадобятся во время посещения пользователем вашего сайта, considier Session.

person thesmart    schedule 22.02.2009
comment
Я как бы обратился к этому в вопросе. Но я как бы думаю, что в 9 случаях из 10 имеет больше смысла использовать уникальный ключ, хранящийся на странице, для размещения переменных в сеансе, чем вообще использовать состояние просмотра. Я думаю, что сеанс - это правильный ответ, потому что вы не перегружаете пропускную способность. - person Mark Rogers; 23.02.2009
comment
Очень хорошо сказано: Viewstate - это механизм для запоминания состояния пользователя на клиенте. Сессия - это механизм запоминания состояния пользователя на сервере. +1 - person Guy; 24.02.2009
comment
Эх, это основная официальная документация, но мой вопрос был сосредоточен на том, что реализация просмотра страницы по умолчанию выглядела плохо спроектированной. Как и у многих небольших частей .net, CLR имеет недостатки в дизайне, хотя большая часть его довольно прочна. - person Mark Rogers; 25.02.2009

Например, когда ваше приложение может работать на компьютерной ферме, и вы не можете настроить сеанс для использования sql-сервера (или использование sql-сервера слишком сильно снижает производительность)

person Alex Reitbort    schedule 22.02.2009
comment
В любом случае вы бы не хотели, чтобы ваша ферма использовала базу данных для хранения сеанса, это будет медленнее, чем просто использование липких IP-адресов. Сеанс - это плохо для сайта, который хочет масштабироваться за пределы нескольких пользователей. - person Robert C. Barth; 23.02.2009
comment
Вы также можете использовать сеансовый сервер. Это намного быстрее и будет поддерживать сеанс для всех серверов в ферме без накладных расходов на сеанс SQL. - person Guy; 24.02.2009
comment
@ Парень, можно. Но это тоже не всегда возможно. И намного проще просто сохранить небольшой фрагмент информации в viewstate, а затем приобрести дополнительный сервер и настроить его как сервер сеанса. - person Alex Reitbort; 25.02.2009
comment
Да, в случае использования SQL для хранения сеанса вы не захотите сохранять ViewState в сеансе. Обычный сеанс достаточно медленный, но добавление к нему ViewState было бы ужасно. - person Russ; 24.03.2009

ViewState и Session имеют разные области видимости. ViewState предназначен для хранения более или менее переходных данных во время «обратной передачи», в то время как сеанс используется для сохранения критически важных данных о состоянии сеанса. Я рекомендую использовать ViewState для состояния, относящегося к определенному «сеансу страницы».

Если вам не нравится нормальное поведение ViewState, довольно просто написать свой собственный PageStatePersister и позволить этому объекту выполнять постоянство, например, используя сеанс или что-то вроде Memcached. Затем вы можете полностью переопределить механизм сохраняемости по умолчанию.

Затем хорошо то, что вы можете беспрепятственно продолжать использовать стандартные веб-элементы управления в .NET Framework, которые все будут использовать ViewState / ControlState для этого типа данных, не увеличивая ViewState. Механизм сохранения памяти сервера может быть очень эффективным.

person baretta    schedule 22.02.2009
comment
Хм, да, я ничего не знал о PageStatePresister. Спасибо за информацию. - person Mark Rogers; 23.02.2009

Не совсем прямой ответ на ваш вопрос, но он может решить вашу проблему.

Вы можете сохранить серверную часть viewstate, исключив полезную нагрузку для клиента.

Создайте класс, унаследованный от страницы, и переопределите PageStatePersister. http://msdn.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx

 public class RussPage : Page
    {
         protected override PageStatePersister PageStatePersister
        {
            get
            {
                return new SessionPageStatePersister(Page);
            }
        }
    }
person Russ    schedule 23.02.2009
comment
Я тоже не делал этого примерно 2 года назад. Я обнаружил, что это мое счастливое место, когда дело дошло до вопроса о ViewState и Session. - person Russ; 23.02.2009
comment
Разве здесь не сказано, что вы просто сохраняете информацию о состоянии просмотра в сеансе? Тогда почему бы тебе просто не сделать это напрямую? - person Alex Reitbort; 25.02.2009
comment
Это прерывает просмотр сайта с вкладками, окнами или другой многозадачностью! Сеанс разделяется между несколькими вкладками, открытыми на одном сайте, ViewState - нет. - person Jeffrey Hantin; 24.03.2009
comment
@ Джеффри Хантин - Достаточно честно. И если вы работаете в такой среде, вы должны это учитывать. Для подобных случаев вы можете создавать разные подклассы Page. Любой случай программирования должен быть рассмотрен, и проектные решения должны быть приняты в зависимости от ситуации. - person Russ; 24.03.2009

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

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

person Joel Coehoorn    schedule 22.02.2009

Не ответ на ваш вопрос, но одно из ваших предположений неверно.

Идентификаторы сеанса могут быть переданы в URL-адресе. Сессия не требует файлов cookie.

http://msdn.microsoft.com/en-us/library/aa479314.aspx

<sessionState cookieless="true" />
person andleer    schedule 22.02.2009
comment
Хотя это старая тема, безопасность ASP.NET часто игнорируется, поэтому здесь говорится: в целом cookieless = true не одобряется из-за проблем с безопасностью (см. Не допускать попадания конфиденциальной информации в URL-адрес: owasp.org/index.php/), потому что сеанс передается в полном виде. Дино упоминает об этом в статье: msdn.microsoft.com/en-us / library / - person Jeff Mergler; 10.06.2016

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

person Charles Graham    schedule 22.02.2009