1

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

1) ASP.net MVC 4 Web 应用程序使用 sessionState 模式="SQLServer" 进行会话管理

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

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

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

在 asp.net MVC4 应用程序中重新连接到 Servicestack 会话

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

如何在 ServiceStack 服务实现中使用标准 ASP.NET 会话对象

用户登录到 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 应用程序中初始化相同的会话变量

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

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

更新 :

我找到了一种将会话 ID 发送到应用服务器的方法

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

 cookie.Domain = ".app.localhost";

 client.CookieContainer.Add(cookie);

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

4

1 回答 1

2

ServiceStack 不使用 ASP.NET 的 Session Provider 来存储 Session,它使用自己的Session API将 Session存储到注册的Caching provider中。

例如,将 Sessions 存储在 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(); 

要访问会话,您需要访问会话 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,您还可以使用以下命令访问底层 ASP.NET HttpRequest

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

注意:ServiceStack 有自己的干净的SessionCaching Providers,它们完全独立于 ASP.NET Session 或 Caching Provider 模型,后者在设计上降低了性能

于 2015-08-10T15:17:27.747 回答