Почему ViewState по умолчанию не хранится на сервере? - PullRequest
2 голосов
/ 27 февраля 2012

Может кто-нибудь дать мне вескую причину, по которой ViewState по умолчанию не хранится на сервере?

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

Я что-то упустил?

Ответы [ 4 ]

4 голосов
/ 27 февраля 2012

Масштабируемость - представьте, сколько ресурсов сервера потребуется, если пользователи 1M просмотрят сложную страницу WebForms.Сервер должен будет удерживать ViewState как минимум в течение времени ожидания сеанса.Автоматическая очистка viewstate на стороне сервера также была бы проблематичной - пользователь может просматривать несколько страниц одновременно, поэтому необходимо сохранить ViewState для всех страниц.

Edit В * обсуждается несколько методов1005 * этих сообщений о том, как перенести состояние представления на сервер.Однако перед тем, как вы это сделаете, было бы неплохо удалить ненужное состояние просмотра из элементов управления / страниц, которые в этом не нуждаются (например, только просмотр / отсутствие рендеринга в обратном порядке).

Я догадываюсь сейчас, нокогда viewstate был спроектирован лет 10 назад или около того, 1 ГБ ОЗУ на 32-битном сервере было примерно таким же хорошим, как и раньше, и MS, по-видимому, приходилось думать о том, что хостинг-провайдерам нужно загружать 100 приложений на сервер.Таким образом, пропускная способность, вероятно, рассматривалась как более дешевая, чем у сервера Ram и дискового хранилища.

2 голосов
/ 14 марта 2012

Существует ряд проблем с сохранением ViewState в памяти.

  1. Если приложение перезагружается, VS для всех, кто использует приложение, теряется.

  2. Увеличивает потребление памяти приложением.Это не проблема, если на сервере размещено всего несколько приложений;но бывают случаи, когда на одном боксе может быть размещено много сайтов.

  3. Масштабируемость;чем активнее приложение, тем больше VS должно быть сохранено.И вы не можете принять 1-1 (1 пользователь - 1 VS).У пользователя может быть открыто несколько вкладок, он может вернуться назад, оставить вкладки неактивными и т. Д., Что приводит к:

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

  5. Что произойдет, если вы размещены на веб-ферме.Мы не можем гарантировать, что пользователь будет нажимать на одну и ту же машину при каждом запросе.

При этом существует несколько решений:

Memcached-Viewstate - сохраняет VS в распределенной памяти, используя Memcache.Это не идеально - если сервер отключает VS для любого, у кого VS хранится на этом сервере, он потерян, но позволит сбросить пулы приложений без проблем.

SQL-Viewstate - сохраняет VS в базе данных SQL.Это добавляет минимум 1 чтение БД и 1 запись БД на запрос.Опять же, не идеально, но если VS получает неуправляемый, получение и настройка VS из базы данных происходит быстрее, чем отправка и получение по HTTP.

Файловая система-Viewstate - сохраняет VS в файловой системе.Это дешевле, чем соединение SQL, но для работы в распределенной среде потребуется файловый сервер.

0 голосов
/ 22 апреля 2017

Основная причина заключается в использовании состояния просмотра на стороне клиента в том, что сервер не знает текущего состояния страницы.

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

Также состояние просмотра на стороне сервера влияет на производительность сервера и взаимодействие с пользователем.Если пользователь не взаимодействует со страницей в течение дня или долгое время, состояние просмотра на сервере истекает.Когда пользователь отправляет страницу назад, возникает исключение.

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

0 голосов
/ 27 февраля 2012

Это улучшает масштабируемость, поскольку серверу не нужно хранить все это в памяти.Можно сохранить состояние представления в сеансе, но обычно это не рекомендуется.

...