gpt4 book ai didi

c# - SignalR(v2.2.0) OnDisconnected 设置用户离线

转载 作者:行者123 更新时间:2023-11-28 08:42:40 24 4
gpt4 key购买 nike

我正在使用以下代码将用户添加到组中,并使用以下代码将用户保存到该特定组的数据库中。

服务器:

  public class ChatHub : Hub
{


public async Task JoinRoom(string user_Id, string room_Id, string user_Name)
{
AddLoginUser(room_Id, this.Context.ConnectionId, user_Id);
await this.Groups.Add(this.Context.ConnectionId, room_Id);
}


public void Connect(string user_Id, string room_Id, string user_Name)
{
var id = Context.ConnectionId;

Clients.Caller.onConnected(id, user_Name, GetRoomUser(room_Id), GetRoomMessage(room_Id));

// send to all in group to update user list
Clients.OthersInGroup(room_Id).onNewUserConnected(id, user_Name);
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{

using (DataContext dc = new DataContext())
{
var item = dc.LoggedInUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
item.Connected = false;
dc.SubmitChanges();

Clients.OthersInGroup(item.RoomID.ToString()).onUserDisconnected(Context.ConnectionId, item.UserMaster.User_Name);
}

return base.OnDisconnected(stopCalled);
}
}
}

private void AddLoginUser(string room_Id, string connection_Id, string user_Id)
{
using (DataContext dc = new DataContext())
{
var checkUserLogedIn = (from user in dc.LoggedInUsers
where (user.RoomID == Convert.ToInt32(room_Id) && user.UserID == Convert.ToInt32(user_Id))
select user).SingleOrDefault();
if (checkUserLogedIn == null)
{
LoggedInUser objLoggedInUser = new LoggedInUser();
objLoggedInUser.ConnectionId = connection_Id;
objLoggedInUser.UserID = Convert.ToInt32(user_Id);
objLoggedInUser.RoomID = Convert.ToInt32(room_Id);
objLoggedInUser.Connected = true;
dc.LoggedInUsers.InsertOnSubmit(objLoggedInUser);
dc.SubmitChanges();
}
else
{
if (!checkUserLogedIn.Connected)
{
checkUserLogedIn.Connected = true;
dc.SubmitChanges();
}
}
}
}

问题:

假设我使用 roomid=1 和 contextid=123asd 的 userid=1 登录。如果我刷新我的窗口然后 contextid 将更改,现在如果我关闭浏览器选项卡然后查询:

var item = dc.LoggedInUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);

没有根据最新的 connectionid 找出用户,因为当我在连接上保存用户时 connectionid 是不同的。

如何在断开连接事件中为特定用户设置连接状态为 false。

提前致谢。

最佳答案

OnConnected 你应该保存所有 connectionIds(与用户映射),connectionId 应该是唯一的,而不是用户。因为一个用户可以同时有多个连接到 signalr(新标签)。

每次你应该在 Onconnected 上映射用户和 connectionId。每次您应该只删除该 connectionId,而不是 OnDisconnected 上用户的所有 connectionId。如果用户不在列表中(如果未调用停止调用,即使用户未断开连接也可能发生断开连接),您应该在 OnReconnected 上添加 connectionId。

您应该以此为基础重构您的代码库。首先,您应该删除 connectionId。然后,您可以检查;如果列表中没有此用户(与该connectionId映射)的记录,则可以发送消息。

检查 here

我已经稍微修改了你的代码,你可以根据这些知识改进这段代码。您还应该在 OnReconnected 上调用 AddLoginUser

     public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
using (DataContext dc = new DataContext())
{
var item = dc.LoggedInUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
dc.LoggedInUsers.Remove(item);
dc.SubmitChanges();
//If there is no other connection left with this user in this room send message.
if (!dc.LoggedInUsers.Any(x => x.RoomID==item.RoomID && x.userId==item.UserId)
Clients.OthersInGrouproomId.ToString()).onUserDisconnected(Context.ConnectionId, item.UserMaster.User_Name);
}
return base.OnDisconnected(stopCalled);
}
}
}

private void AddLoginUser(string room_Id, string connection_Id, string user_Id)
{
using (DataContext dc = new DataContext())
{
//Just check connectionId uniqunes. You don't need connected field.
var checkUserLogedIn = (from user in dc.LoggedInUsers
where user.ConnectionId == connection_Id
select user).SingleOrDefault();
if (checkUserLogedIn == null)
{
LoggedInUser objLoggedInUser = new LoggedInUser();
objLoggedInUser.ConnectionId = connection_Id;
objLoggedInUser.UserID = Convert.ToInt32(user_Id);
objLoggedInUser.RoomID = Convert.ToInt32(room_Id);
dc.LoggedInUsers.InsertOnSubmit(objLoggedInUser);
dc.SubmitChanges();
}
}
}

关于c# - SignalR(v2.2.0) OnDisconnected 设置用户离线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36081019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com