Зачем вам когда-либо использовать объект хранения ViewState asp.net над объектом хранения сеанса? - PullRequest
16 голосов
/ 22 февраля 2009

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

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

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

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

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

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

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

Ответы [ 8 ]

22 голосов
/ 22 февраля 2009

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

11 голосов
/ 23 февраля 2009

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

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

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

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

Как правило, нет «правильного» ответа, который можно использовать. Это все о том, что вы пытаетесь достичь.

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

5 голосов
/ 23 февраля 2009

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

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

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

5 голосов
/ 22 февраля 2009

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

4 голосов
/ 23 февраля 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);
            }
        }
    }
4 голосов
/ 22 февраля 2009

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

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

2 голосов
/ 23 февраля 2009

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

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

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

<sessionState cookieless="true" />
1 голос
/ 22 февраля 2009

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

...