心跳上的ServiceStack更新会话

时间:2016-03-03 04:42:21

标签: c# .net servicestack httpserver

我的ServiceStack应用中有一个使用ServerEventsFeature的情况,我希望在用户心跳期间更新会话\用户信息。

问题是,在功能中,OnHeartbeatInit的处理程序将返回一个未连接到会话缓存中任何会话的随机ID,例如对于一个经过身份验证的客户端:

OnHeartbeatInit = req =>
{
    var userSession = req.GetSession();
    var sessionKey = SessionFeature.GetSessionKey(req.GetSessionId());
    //will be XXXXXXXXXXXXXXX
    var cache = Container.Resolve<ICacheClient>();
    var sessionPattern = IdUtils.CreateUrn<IAuthSession>("");
    var sessionKeys = cache.GetKeysStartingWith(sessionPattern).ToList();
    var allSessions = cache.GetAll<IAuthSession>(sessionKeys);
    var cacheSes = allSessions.FirstOrDefault().Key;
    //will be YYYYYYYYYYYYYYYY
}

那么有没有办法在心跳期间更新session \ _用户?

1 个答案:

答案 0 :(得分:1)

如果您只是尝试更新单个会话,则只需:

即可检索和更新会话
OnHeartbeatInit = req =>
{
    var userSession = req.GetSession();
    userSession.LastModified = DateTime.UtcNow;
    req.SaveSession(userSession);
}

以下所有代码:

//will be XXXXXXXXXXXXXXX
var cache = Container.Resolve<ICacheClient>();
var sessionPattern = IdUtils.CreateUrn<IAuthSession>("");
var sessionKeys = cache.GetKeysStartingWith(sessionPattern).ToList();
var allSessions = cache.GetAll<IAuthSession>(sessionKeys);
var cacheSes = allSessions.FirstOrDefault().Key;

如果您有很多用户会话(尤其是每次心跳),那么效率非常低,因为您正在查询并反序列化所有用户会话。