Хранение сеанса 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);