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

StackOverflow https://stackoverflow.com/questions/575568

Вопрос

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

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

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

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

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

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

Редактировать:У всех был отличный ответ, извините, если я не выбрал ваш.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Создайте класс, который наследует page, и переопределите 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);
            }
        }
    }

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

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

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

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

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

<sessionState cookieless="true" />

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top