我目前将用户保留在名为OnlineUsers的表中。当一个人连接或断开连接时,它会将用户ID和连接ID添加到表中,但出现问题(我认为当多个浏览器窗口打开时),Disconnect函数有时不会触发,导致将用户保留在表中并使其看起来是“在线”的,而实际上他们并不在线。有没有人遇到过这个问题,并想知道如何解决这个问题?
更新 **(抱歉没有放置代码,我应该一开始就做到这一点)
以下是我的数据库函数,用于向表中添加和删除:
我已经检查过,我在使用最新版本的SignalR(0.5.3),当我同时关闭多个浏览器窗口时,会出现这种情况,用户将被卡在数据库中。如果需要的话,以下是我的连接ID生成器类:
更新 **(抱歉没有放置代码,我应该一开始就做到这一点)
以下是我的数据库函数,用于向表中添加和删除:
public bool ConnectUser(Guid UserId, String ConnectionId)
{
if (!Ent.OnlineUsers.Any(x => x.UserId == UserId && x.ConnectionId == ConnectionId))
{
Ent.OnlineUsers.AddObject(new OnlineUser { UserId = UserId, ConnectionId = ConnectionId });
Ent.SaveChanges();
return true;
}
else
return false;
}
public void DisconnectUser(Guid UserId, String ConnectionId)
{
if (Ent.OnlineUsers.Any(x => x.UserId == UserId && x.ConnectionId == ConnectionId))
{
Ent.OnlineUsers.DeleteObject(Ent.OnlineUsers.First(x => x.UserId == UserId && x.ConnectionId == ConnectionId));
Ent.SaveChanges();
}
}
这是我的中枢类连接和断开任务:
public Task Disconnect()
{
disconnectUser();
return null;
}
public Task Reconnect(IEnumerable<string> connections)
{
connectUser();
return null;
}
public Task Connect()
{
connectUser();
return null;
}
private void connectUser()
{
if (onlineUserRepository.ConnectUser(MainProfile.UserId, Context.ConnectionId))
{
Groups.Add(Context.ConnectionId, Convert.ToString(MainProfile.ChatId));
}
}
private void disconnectUser()
{
onlineUserRepository.DisconnectUser(MainProfile.UserId, Context.ConnectionId);
Groups.Remove(Context.ConnectionId, Convert.ToString(MainProfile.ChatId));
}
我已经检查过,我在使用最新版本的SignalR(0.5.3),当我同时关闭多个浏览器窗口时,会出现这种情况,用户将被卡在数据库中。如果需要的话,以下是我的连接ID生成器类:
public class MyConnectionFactory : IConnectionIdGenerator
{
public string GenerateConnectionId(IRequest request)
{
if (request.Cookies["srconnectionid"] != null)
{
return request.Cookies["srconnectionid"].ToString();
}
return Guid.NewGuid().ToString();
}
}