2010-10-21 3 views
0

Мне недавно было поручено установить довольно неприятную ошибку, вызванную неправильным использованием состояния сеанса. У нас есть веб-приложение asp.net, которое работает на одном сервере с использованием состояния сеанса inproc. Основной дизайн заключается в том, что типизированный набор данных загружается из базы данных и сохраняется в состоянии сеанса с использованием общего имени переменной сеанса, такого как Session ["dataset"] = набор данных. После того, как данные хранятся в сеансе, пользователь редактирует данные, набор данных извлекается из сеанса, обновленного и отправленного в базу данных для обновления. Этот тип редактирования данных \ сохранение используется в нескольких веб-формах, которые в основном делают то же самое. Все хорошо, пока пользователь не попытается запустить второй экземпляр приложения, и данные, хранящиеся в переменной сеанса, могут быть замешаны.Как лучше всего исправить проблему переменной состояния сеанса InProc multi?

Вот возможные исправления, которые я смог не найти

  1. Set sessionState Cookieless = «ложь» (каждый новый экземпляр получает уникальный идентификатор сеанса) ПРОФИ - простое решение, практически нет коды необходимые изменения CONS - guid in url, пользователь может редактировать guid, guid может быть скопирован

  2. Используйте специальный ключ сеанса для каждого экземпляра (передайте ключ сеанса и соедините его с «набором данных» + имя сеанса сеанса, каждый экземпляр имеет уникальную переменную сеанса) PROS - нет Guid в URL-адрес СВОД - наибольшее количество изменений кода, возможно хрупкое

  3. Удалить переменную сеанса (Load набора данных из базы данных во второй раз для редактирования) отождествлялась высвобождает ресурсы сервера, больше не зависит от состояния сеанса СВОД - падение производительности, высокое количество изменений кода

Каждый знает о любых других возможных решений? Спасибо

ответ

0

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

Самым простым, вероятно, будет использование cookieless = true, и надеемся, что все URL-адреса будут правильно переписаны. Лучше всего, вероятно, просто получить доступ к базе данных напрямую, скорее всего, она не затронет столько, сколько вы думаете, и если это повлияет, вы действительно не должны кэшировать много данных на пользователя, вместо этого вы должны использовать глобальный кеш.

+0

Согласен, данные кэширования для каждого пользователя плохие. Вот почему я пытаюсь это исправить. Когда вы говорите, что используете «глобальный кеш», я не уверен, что вы имеете в виду. Я использовал кэш приложений для данных приложения, но как это работает для данных, загружаемых для каждого пользователя? – NullReference

+0

Глобальный относительный, для каждого приложения это то, что я думал :) Если вам действительно нужно иметь данные для каждого пользователя, вы можете сохранить эти данные с помощью ключа, который подключен к пользователю. Но опять же, я не рекомендую кэш, если у вас действительно проблемы с производительностью. – Onkelborg

0

Вы заявляете, что третьим вариантом будет удар производительности (полностью удалить объект сеанса), но попробовали ли вы его?

Я спрашиваю, потому что сериализация стандартного набора данных is notoriously resource intensive on the server side - объем памяти во многих случаях может увеличиваться на порядок (набор данных 1 МБ может занимать 10-15 МБ для сериализации), а также время процессора для этого.

Я бы очень рекомендую посмотреть на попытке 3 и тестирование, чтобы убедиться, что ваши опасения вполне обоснованы, или если вы на самом деле увидеть прирост производительности;)

Если вы установите на хранение массивов данных в сессии, то вы следует посмотреть на custom serialisation, чтобы свести к минимуму объем хранимых данных.

+1

Я не пробовал удалить объект сеанса и перезагружать данные, я попробую. – NullReference

+0

Как примечание, похоже, что набор данных хранится в сеансе, используя Session ["dataset"] = dataset.GetXml(). Не уверен, что это не что иное, как просто прямая сериализация. – NullReference

+0

В состоянии сеанса proc не сериализуется, но кажется, что серализация принудительна, хотя .. – Onkelborg

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