Какой объем данных вы можете / должны хранить в объекте сеанса пользователя?
Вопрос
У нас есть несколько приложений-форм в стиле мастера на нашем веб-сайте, где мы собираем информацию от пользователя на каждой странице, а затем отправляем в серверный процесс с помощью веб-службы.
К сожалению, мы не можем отправлять информацию порциями во время отправки каждой формы, поэтому нам приходится сохранять ее в сеансе пользователя до конца процесса и отправлять все это одновременно.
Является ли объем памяти сервера / дискового пространства sql server единственным ограничением того, сколько я могу хранить в сеансах пользователей, или есть что-то еще, что мне нужно учитывать?
Редактировать:Сайт построен на основе ASP.NET веб-форм.
Решение
Предполагая, что информация не является конфиденциальной, вы могли бы сохранить ее в файле cookie, что уменьшило бы объем информации, необходимый для хранения на стороне сервера.Это также позволило бы вам получить доступ к информации через JavaScript.
В качестве альтернативы вы могли бы использовать viewstate для хранения информации, хотя это может привести к отправке больших объемов данных между сервером и клиентом, а не к моему предпочтительному решению.
Объем информации о сеансе, которую вы должны хранить, сильно варьируется в зависимости от приложения, количества ожидаемых пользователей, спецификации сервера и т.д.Чтобы дать более точный ответ, потребовалось бы больше информации :)
Наконец, предполагая, что информация, собираемая на протяжении всего процесса, не требуется от страницы к странице, тогда вы могли бы сохранить всю информацию в таблице базы данных и сохранять только уникальный идентификатор записей в сеансе.По мере отправки каждой страницы запись в базе данных обновляется, а затем на последней странице извлекается и передается вся информация.Это не идеальное решение, если вам нужно извлекать предыдущую информацию на каждой последующей странице из-за количества требуемых чтений из базы данных.
Другие советы
У вас также может быть 1 страница asp со всей html-формой и скрывать ее части до тех пор, пока пользователь не заполнит и не "отправит" видимую часть...
затем просто скройте заполненную часть и покажите следующую часть формы...
В NET Framework это было бы чрезвычайно просто .Используйте панели для каждого "шага мастера" и добавьте логику, когда отображать и скрывать каждую панель.
после этого у вас будут все данные на одной странице.
Если вы используете традиционную HTTP-модель (т. е.не используйте runat="сервер") вы можете опубликовать данные на другой странице asp и поместить опубликованные данные в скрытые элементы формы, вы можете сделать это для любого количества страниц, которые вам нужны, таким образом избегая размещения чего-либо в переменной сеанса.
Поскольку с точки зрения производительности хранить большие объемы данных в объекте сеанса пользователя проблематично, ASP.Net помимо того, что упомянуто в сообщениях выше, предлагаются некоторые другие обходные пути. ASP.NET Поставщик профилей позволяет сохранять информацию, связанную с сеансом, в базе данных.Вы также можете использовать Сервер состояния сеанса который использует отдельный сервер для хранения всей информации о сеансе.В обеих этих ситуациях учитывается, что если вам нужно использовать кластеры или средства балансировки нагрузки, серверы все равно могут распознавать информацию о сеансе на разных серверах.Если вы храните информацию в объекте Http Session, вы сталкиваетесь с проблемой, заключающейся в том, что один пользователь всегда должен обращаться к одному и тому же серверу для этого сеанса.
Сеанс, состояние просмотра, база данных.Все это медленно, но поможет выполнить работу.
Скрытые поля формы - это ответ, который мне нравится больше всего.
Существуют и другие способы сохранения состояния.Файлы cookie, всплывающее окно, набор фреймов или iframes.