Хранение сеанса ASP.NET в Redis и чтение его в ServiceStack

Все,

У нас есть несколько сайтов ASP.NET, которые используют RedisSessionStateProvider для хранения сеансов. Мы только начинаем раскручивать экземпляр ServiceStack, и я хотел бы передать sessionId из ASP.NET в ServiceStack, а затем использовать сохраненные значения из Redis в сеансах ServiceStack.

До сих пор я был в состоянии передать sessionID в заголовке, получить его в моем плагине и получить значение, соответствующее этому sessionId, из Redis обратно в виде строки.

Моя проблема в том, что типизированный объект входит в Redis из ASP.NET, но я не могу получить его как объект типа, выходящий в ServiceStack.

Любые и все предложения приветствуются.

Спасибо б

1 ответ

Решение

Сеансы ServiceStack полностью отделены / независимы от сессий ASP.NET и модели поставщика сессий. Поскольку они представляют собой две совершенно разные технологии и несовместимы друг с другом, вам потребуется отдельный "шаг миграции", чтобы извлечь данные из состояния сеанса ASP.NET, заполнить свой типизированный пользовательский сеанс и сохранить его в ServiceStack.

Сеансы ServiceStack - это просто ваш типизированный сеанс UserSession, сохраненный в зарегистрированном поставщике кэширования по ключу, указанному в Cookie SessionId.

Навигация по всем пользовательским сеансам в кеше

Проверка сохраняемых сеансов пользователей иллюстрирует, как сеансы пользователей сериализуются, а POCO хранятся в зарегистрированном ICacheClient по следующему ключу:

urn:iauthsession:{SessionId}

куда {SessionId} либо пользователи ss-id или же ss-pid cookie в зависимости от того, был ли пользователь аутентифицирован RememberMe=true который инструктирует ServiceStack, чтобы сохранить сеанс против ss-pid постоянный файл cookie- это предпочтение хранится в ss-opt=perm печенье.

Так как они представляют собой обычные POCO, хранящиеся в формате с предсказуемым ключом, мы можем легко выполнять итерации по всем сеансам пользователя, напрямую используя API ICacheClient, например:

var sessionPattern = IdUtils.CreateUrn<IAuthSession>(""); //= urn:iauthsession:
var sessionKeys = Cache.GetKeysStartingWith(sessionPattern).ToList();

var allSessions = Cache.GetAll<IAuthSession>(sessionKeys);
Другие вопросы по тегам