2010-09-11 5 views
1

Будьте внимательны при хранении модели в сеансе . Он будет вести себя по-другому , чем вы ожидаете, и можете легко выйти из системы синхронизации с базой данных. Вместо , сохраняя модель непосредственно в сеансе , сохраните идентификатор модели и используйте это для извлечения из базы данных .ASP.NET - сеансы?

Лучше ли это использовать, как указано выше, просто ввести идентификатор модели в сеанс, а затем извлечь ее позже или передать всю модель?

ответ

1

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

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

* Тем не менее, это открывает совершенно другой набор вопросов, связанных с кешированием и обращением к базе данных каждый раз, на что может ответить только тщательный архитектурный обзор приложения и шаблонов использования. Является ли WFE (web front-end) память менее требовательной, чем соединения с базой данных. Является ли хитом получения объекта больше или меньше, чем сохранение копий в других местах?

+0

Это за форму заказа продукта. – ebb

+0

@ebb, тогда вы, вероятно, просто ответили на вопрос! –

+0

Сохраните идентификатор в сеансе вместо модели :)? – ebb

0

Я не буду хранить целые модели в сеансе и склоняюсь к методу ID. Причина заключается в том, что сеанс будет сохраняться в течение всего времени, пока пользователь находится на вашем сайте, и он не будет очищен после того, как пользователь переместится на страницу diff, которая больше не требует данных. Что делать, если пользователь получает доступ ко многим страницам, на которых выполняется этот тип хранилища? Это может привести к большому количеству потраченной впустую памяти.

Если это данные, которые могут быть использованы многими пользователями, вы можете использовать Cache вместо Session, так как это позволит вам копировать одни и те же данные на нескольких сеансах.

EDIT: Заметил, что вы заметили, что это бланк заказа. Вы можете использовать сеанс для хранения «текущего заказа» для пользователя и очистки его/замены при отправке/создании заказов. Вам нужно сохранить его, потому что есть несколько шагов? В некоторых случаях, если это очень ограниченные данные, вы можете сохранить их в файлах cookie, а затем обязательно очистите файл cookie, как только будет выполнен заказ.

+0

Причиной хранения данных/идентификатора в сеансе является то, что его динамические сгенерированные элементы html (текстовые поля и т. Д.), И поэтому при выполнении проверки он обрабатывает все элементы html в определенной категории продукта и проверяет наличие ошибок (длина, регулярное выражение , allownull и т. д.). Таким образом, сессия фактически содержит идентификатор для этих элементов. - Так что да, когда они подают и успешно, тогда он должен очистить сессию. – ebb

0

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

Если вы храните весь объект в сеансе, вы в основном используете , кешируя его, и вам нужно знать обо всех соответствующих проблемах кеширования (устаревшие данные, размер памяти и т. Д.).

Преимущество хранения всего этого

  • Не имея, чтобы вернуться в базу данных (быстрее, если сеанс в памяти)

Недостатки бы

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

В основном вы удаляете уровень сложности в своем приложении (хотя добавление дополнительного вызова к db), просто сохраняя идентификатор.

+0

Что делать, если мне нужно сохранить ввод пользователя в сеанс, чтобы я мог перенаправить на страницу подтверждения? - Тогда у меня «есть», чтобы поместить модель в сеанс. – ebb

+0

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

0

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

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

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

+0

Ну ... скажем, у вас есть страница, в которой вы вводите данные, а затем, когда вы нажимаете кнопку «Отправить», а проверка прошла успешно, она перенаправляет вас на страницу подтверждения. Страница подтверждения должна быть просто набором меток/абзацев, описывающих, что пользователь ввел в полях на предыдущей странице, и кнопку «Назад», если они хотят что-то изменить ... Таким образом, данные с предыдущей страницы должны быть хранятся в скрытом сериализованном поле или что-то, что можно отправить, когда они нажимают «Заказать» на странице подтверждения? – ebb

+0

@ebb да, сериализация - способ сохранить его в скрытом поле. Вам нужно запустить его с помощью того же метода проверки, который вы использовали в исходном сообщении, не будет запускать ничего для обычных пользователей, но вы не можете доверять пользователю. Аналогичный вариант заключается в том, чтобы сохранить его в ViewState на странице, что приводит к его сериализации и имеет некоторый уровень защиты от несанкционированного доступа (безопаснее его проверять). – eglasius

+0

Использование ASP.NET MVC, так что нет ViewState :) – ebb

Смежные вопросы