ASP.NET Session - PullRequest
       13

ASP.NET Session

1 голос
/ 07 сентября 2011

есть ли способ иметь разные состояния сеанса? Например, в сеансе хранятся разные объекты, но с разным сроком действия

е:

У меня есть два объекта сеанса, Session ["ReportIDs"] и Session ["IsAdmin"]

Session ["ReportIDs"] - содержит просматриваемые идентификаторы отчетов и может быть перезаписан при просмотре новых отчетов текущим пользователем. Session ["IsAdmin"] - читается из БД, я не хочу постоянно вызывать БД для получения обновленного значения, поэтому сохраняйте его в сеансе. Но если userB изменяет значение этого объекта для UserA (на экране администратора), то значение в сеансе будет сохраняться до общего времени ожидания сеанса, установленного в web.config

Есть ли способ установить разные сроки действия для этих объектов сеанса?

спасибо

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Вы не можете установить тайм-аут для определенных объектов, хранящихся в сеансе.

Что вы можете сделать, это добавить другое значение, скажем, LastRealAdminCheck, содержащее дату.Тогда не проверяйте Session ["IsAdmin"] напрямую, а с помощью какого-либо метода, который также проверяет, что LastestRealAdminCheck проверяет, не пришло ли время снова обратиться к базе данных.

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

2 голосов
/ 07 сентября 2011

Сеансы сохраняются на ПОЛЬЗОВАТЕЛЯ, что означает, что даже если вы используете один и тот же ключ, все, что хранится в Сессии под тем же ключом, будет отличаться для каждого пользователя. Другими словами, пользователь A не может перезаписать данные для пользователя B.

Другая вещь - это Cache: Cache используется для всего приложения и может быть перезаписан одним пользователем другому. У кэша есть срок действия и другие функции, такие как автоматическое подключение к какому-либо событию, когда срок действия кэшированного объекта истекает, что позволяет автоматически обновлять его и т. Д.

В заключение: сессия на пользователя. Кэш распределяется между ВСЕМИ ПОЛЬЗОВАТЕЛЯМИ.

РЕДАКТИРОВАТЬ Обновление моего ответа для правильного решения вопроса telsokari:

Срок действия объектов сеанса не истекает до истечения срока действия самого сеанса. Нельзя сказать, чтобы сессия «истекала» один объект через определенное количество времени. Вы можете удалить их вручную, если это то, что вы хотите сделать. Просто подключитесь к любым событиям в приложении, таким как Begin_Request и End_Request.

Но я не понимаю, что вы беспокоитесь о сохранении объектов в сеансе до тех пор, пока пользователь не выйдет из системы или не истечет сеанс ... Если вы помещаете много данных в сеанс, то, возможно, вам не следует кэшировать эти данные в первое место. Если вы помещаете объекты контролируемого размера, то в чем проблема? Вопрос не должен быть «Когда я должен истечь этот объект в сеансе»? а точнее: «Имеет ли смысл хранить объект в сеансе, в кэше или нет вообще?» Ответ зависит исключительно от вашего конкретного случая, доступных аппаратных ресурсов (памяти) и т. Д. И т. Д.

1 голос
/ 07 сентября 2011

Сессии являются отдельными для каждого пользователя и помещаются в «песочницу». Вы можете назначить IsAdmin один раз, и он останется активным для сеанса этого пользователя. Вы можете изменить ReportIDs столько, сколько захотите, но это будет только для этого одного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...