Альтернатива сеанса .NET в глобальном масштабе - PullRequest
3 голосов
/ 24 февраля 2011

Быстрый вопрос: Существует ли объект хранения данных для каждого пользователя (аналогично Session), в котором я могу хранить данные в глобальной области (аналогично HttpRuntime.Cache)?Почти как если бы у Session и HttpRuntime.Cache был ребенок.

Полный фон: У меня есть сайт ASP.NET, который изначально был написан для одного потока.Теперь я изменил его, чтобы определенные действия вызывали фоновый поток, а браузер опрашивал сервис для получения обновлений статуса.

Проблема, с которой я столкнулся, заключается в том, что некоторые фрагменты данных хранятся в объекте HttpContext.Session [] (например, токен аутентификации членства).Эти фрагменты данных должны быть уникальными для каждого пользователя и доступными для фонового потока.Сессия недоступна фоновому потоку.

Мне известно о HttpRuntime.Cache, но для этого потребуется микроуправление, чтобы сегментировать пользователей и завершить его одновременно с истечением сеанса.Session, с другой стороны, автоматически истекает эти вещи в нужное время, когда я тоже этого хочу, и уже используется такими вещами, как SqlMembershipProvider.

Мой вопрос: есть ли что-то, что ведет себя аналогично?на сессию, но существует в глобальном масштабе?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Попробуйте передать объект HttpContext.Current методу в фоновом потоке. Вы должны иметь возможность доступа к сеансу из фонового потока через currentContext.Session, предполагая, что currentContext - это параметр HttpContext, который был передан.

См. сообщение в блоге о том, как безопасно получить доступ к объекту HttpContext из нескольких потоков.

3 голосов
/ 24 февраля 2011

номер

Поскольку, когда пул приложений перезапускает все фоновые операции, я предлагаю подумать о переносе состояния пользователя в вашу собственную базу данных или внешнее хранилище. К сожалению, вы потеряете преимущества автоматического управления сеансом (скользящий срок действия), но если вам понадобится задняя активность, она будет работать лучше - то есть вы сможете перенести свою деятельность из процесса IIS на отдельный процесс / машину, если это потребуется позже. *

3 голосов
/ 24 февраля 2011

Я не думаю, что есть что-то, что вам нужно из коробки. Хотя я бы сделал следующее:

  1. Пользовательский кеш приложения
  2. Сделать ключ идентификатором пользователя или уникальным идентификатором
  3. Сохраните Dictionary или некоторый список объектов в значении для пользователя. Используйте это для хранения всех необходимых вам данных.
  4. Рассмотрите возможность добавления чего-либо в идентификатор пользователя, если вы считаете, что может возникнуть конфликт с уникальным идентификатором пользователя (например, доменом и т. Д.)
  5. Убедитесь, что истекает срок действия кэшированных данных, аналогично сеансу (например, скольжение)
...