我在不同的服务器上部署了两个应用程序。
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应用程序中获取会话?
答案 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 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有自己的干净Session和Caching Providers,它完全独立于具有degraded performance by design的ASP.NET会话或缓存提供程序模型。