如何使用从mvc应用程序发送的会话ID从SQLServer获取servicestack应用程序中的会话详细信息?

时间:2015-08-10 11:05:09

标签: asp.net-mvc-4 servicestack session-state sql-session-state

我在不同的服务器上部署了两个应用程序。

1)具有sessionState mode =“SQLServer”的会话管理的ASP.net MVC 4 Web应用程序

2)使用sessionState mode =“SQLServer”进行会话管理的Servicestack服务应用程序(是的,我需要服务应用程序中的会话)

应用程序 共享相同的数据库和表以进行会话管理

我正在使用以下解决方案在服务堆栈应用程序中使用asp.net会话。

Reconnecting to Servicestack session in an asp.net MVC4 application

我没有使用servicestack会话,因此我无法使用以下方式。

How can I use a standard ASP.NET session object within ServiceStack service implementation

用户登录mvc Web应用程序,用户数据mvc应用程序依次从服务堆栈应用程序调用服务方法。

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

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

                    });

                    //work on responce
                }

现在我需要在另一台服务器上部署的Servicestack应用程序 中的mvc应用程序中初始化相同的会话变量

会话cookie在mvc Web应用程序中设置,而不是在servicestack应用程序中设置,但会话详细信息存储在两个应用程序都可访问的sql数据库中。

我可以获取当前会话ID并将其作为参数发送给服务,但是如何使用会话ID从数据库获取会话详细信息?

更新:

我找到了一种将会话ID发送到app server的方法

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

 cookie.Domain = ".app.localhost";

 client.CookieContainer.Add(cookie);

如何使用上面的sql server在serviceStack应用程序中获取会话?

1 个答案:

答案 0 :(得分:2)

ServiceStack不使用ASP.NET的会话提供程序来存储Sessions,它使用自己的Session API将Sessions存储到已注册的Caching provider

E.g。要将会话存储在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(); 

要访问会话,您需要访问Session Id(即ss-id或ss-pid Cookie),您可以从IRequest获取:

var sessionId = req.GetSessionId();

然后您可以使用SessionFeature.GetSessionKey()来访问用于存储会话的缓存密钥,即:

var sessionKey = SessionFeature.GetSessionKey(sessionId);

然后您可以从ICacheClient访问:

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

请注意,为当前用户访问Session的最简单方法是:

var userSession = req.GetSession();

访问ServiceStack中的ASP.NET会话

由于ServiceStack只是一个普通的ASP.NET Web应用程序,因此您可以通过HttpContext.Current单例继续访问ASP.NET请求上下文,例如您可以使用以下命令访问ASP.NET会话:

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

另外,由于ServiceStack请求只是下面的一个ASP.NET IHttpHandler,您还可以access the underlyng ASP.NET HttpRequest使用:

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

注意:ServiceStack有自己的干净SessionCaching Providers,它完全独立于具有degraded performance by design的ASP.NET会话或缓存提供程序模型。