Как получить сведения о сеансе в приложении servicestack от SQLServer, используя идентификатор сеанса, отправленный из приложения mvc?

У меня два приложения развернуты на разных серверах.

1) Веб-приложение ASP.net MVC 4 с режимом sessionState = "SQLServer" для управления сеансом.

2) Сервисное приложение Servicestack с sessionState mode = "SQLServer" для управления сеансом (да, мне нужен сеанс в сервисном приложении)

оба приложения используют одну и ту же базу данных и таблицы для управления сеансом

Я использую следующее решение для сеанса asp.net в приложении стека служб.

Повторное подключение к сеансу Servicestack в приложении asp.net MVC4 < / а>

Я не использую сеанс servicestack, поэтому следующий способ мне недоступен.

Как использовать стандартный объект сеанса ASP.NET в реализации службы ServiceStack

Пользователь входит в веб-приложение mvc, для данных пользователя приложение mvc, в свою очередь, вызывает методы службы из приложения стека служб.

using (var client = new JsonServiceClient(servicestackUrl))
                {

                    var response = client.Get<HttpWebResponse>(new GetFile
                    {
                        UserName = UserName,
                        EmployerID = EmployerID,
                        filename = fileName

                    });

                    //work on responce
                }

теперь мне нужно, чтобы те же переменные сеанса были инициализированы в приложении mvc в приложении Servicestack, развернутом на другом сервере

cookie сеанса устанавливается в веб-приложении mvc, а не в приложении servicestack, но сведения о сеансе хранятся в базе данных sql, доступной для обоих приложений.

Я могу получить текущий идентификатор сеанса и отправить его в службу в качестве параметра, но как получить сведения о сеансе из базы данных с помощью идентификатора сеанса?

Обновление:

Я нашел способ отправить идентификатор сеанса на сервер приложений

 var cookie = new Cookie("ASP.NET_SessionId", Session.SessionID);

 cookie.Domain = ".app.localhost";

 client.CookieContainer.Add(cookie);

Как получить сеанс в приложении serviceStack, используя вышеизложенное, с сервера sql?


person amol    schedule 10.08.2015    source источник


Ответы (1)


ServiceStack не использует поставщик сеансов ASP.NET для хранения сеансов, он использует собственный Session API, который сохраняет сеансы в зарегистрированном провайдере кэширования.

Например. чтобы сеансы сохранялись в SQL Server, вы должны использовать OrmLiteCacheClient, который можно зарегистрировать с помощью:

//Register OrmLite Db Factory if not already
container.Register<IDbConnectionFactory>(c => 
    new OrmLiteConnectionFactory(connString, SqlServerDialect.Provider)); 

container.RegisterAs<OrmLiteCacheClient, ICacheClient>();

//Create 'CacheEntry' RDBMS table if it doesn't exist already
container.Resolve<ICacheClient>().InitSchema(); 

Чтобы получить доступ к сеансу, вам необходимо получить доступ к Идентификатору сеанса (т.е. файлы cookie ss-id или ss-pid), которые вы можете получить из IRequest с помощью:

var sessionId = req.GetSessionId();

Затем вы можете использовать SessionFeature.GetSessionKey() для доступа к ключу кеша, который используется для хранения сеанса, то есть:

var sessionKey = SessionFeature.GetSessionKey(sessionId);

Затем вы можете получить доступ из ICacheClient с помощью:

var userSession = cache.Get<IAuthSession>(sessionKey);

Обратите внимание, что самый простой способ получить доступ к сеансу для текущего пользователя - это просто:

var userSession = req.GetSession();

Доступ к сеансам ASP.NET в ServiceStack

Поскольку ServiceStack - это обычное веб-приложение ASP.NET, вы можете продолжать получать доступ к контексту запроса ASP.NET через синглтон HttpContext.Current, например вы можете получить доступ к сеансу ASP.NET с помощью:

var value = HttpContext.Current.Session[key];

Кроме того, поскольку запрос ServiceStack - это просто ASP.NET IHttpHandler внизу, вы также можете получить доступ к базовому ASP.NET HttpRequest с помощью:

var aspReq = req.OriginalRequest as HttpRequestBase;
var value = aspReq.RequestContext.HttpContext.Session[key];

Примечание. ServiceStack имеет собственный чистый сеанс и Поставщики кэширования, который полностью независим от модели сеанса ASP.NET или поставщика кэширования, имеющей снижение производительности по дизайну.

person mythz    schedule 10.08.2015
comment
Спасибо за ответ. Проблема в том, что у нас есть старый проект, который использует сеанс asp.net, теперь мы перешли на Servicestack и по-прежнему хотим использовать сеанс asp.net, что мы можем сделать, как указано в вышеупомянутом вопросе. с этой настройкой, как совместно использовать переменные сеанса в другом приложении, развернутом на другом сервере? - person amol; 11.08.2015
comment
@amol Сеансы ASP.NET - это совершенно другая модель библиотеки / поставщика, которая не имеет ничего общего с Сеансы ServiceStack. Вы по-прежнему можете получить доступ к сеансам ASP.NET через синглтон ASP.NET HttpContext.Current.Session[], просто поймите, что это API-интерфейс ASP.NET System.Web и не имеет ничего общего с сеансами ServiceStack, и ни одна из библиотек ServiceStack не использует ASP. NET, у которых снизилась производительность по дизайну. - person mythz; 11.08.2015
comment
@amol Я обновил свой ответ различными способами доступа к базовому запросу ASP.NET и HttpContext. - person mythz; 11.08.2015
comment
спасибо, но я получаю значение ключа сеанса как null как. Приложение servicestack развернуто на другом сервере. Веб-приложение mvc и приложение-служба servicestack совместно используют состояние сеанса sql. cookie сеанса установлен в приложении MVC, и приложение mvc запросит приложение servicestack. любой способ поделиться идентификатором сеанса и чтобы servicestack автоматически загружал сеанс в сеансе asp.net (что обычно происходит в состоянии сеанса как в режиме sqlserver) - person amol; 11.08.2015
comment
@amol Не могу не подчеркнуть, что ServiceStack не имеет ничего общего с сеансами ASP.NET, не включает его, не затрагивает его, не предоставляет для него API-интерфейсов, не имеет к нему никакого отношения и т. д. хотите включить его, вам нужно будет сделать это за пределами ServiceStack, например, вы можете попробовать включить его с помощью настраиваемого IHttpHandler. Если это не сработает, вам может потребоваться вызвать ServiceStack Services через MVC. - person mythz; 11.08.2015
comment
Я понял это. как упоминалось ранее, я уже использовал сеанс asp.net в приложении servicestack с использованием пользовательского Ihttphandler (упомянутого в вопросе). в любом случае спасибо. - person amol; 11.08.2015