我正在尝试使用SignalR实现在线和离线用户的显示。
我创建了一个集线器并实现了onConnected()方法来调用客户端上的函数来显示新连接的用户到hub和onDisconnected()方法来调用客户端上的函数来删除断开连接的用户。我正在使用表并添加一个新行如果新用户连接到集线器但是如果用户断开与集线器的连接则无法删除。要删除已断开连接的用户,我正在该表中搜索该用户并删除该行但它不起作用。
这是我到目前为止实施的内容:
hub-
上的onConnected()和Disconnected()方法
public override Task OnConnected()
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = Users.GetOrAdd(userName, _ => new User
{
username=userName,
connectionIds=new HashSet<string>()
});
lock(user.connectionIds)
{
user.connectionIds.Add(connectionId);
Clients.Others.userConnected(userName);
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
User user;
Users.TryGetValue(userName, out user);
if (user != null)
{
lock (user.connectionIds)
{
user.connectionIds.RemoveWhere(cid => cid.Equals(connectionId));
if (!user.connectionIds.Any())
{
User removedUser;
Users.TryRemove(userName, out removedUser);
Clients.Others.userDisconnected(userName);
}
}
}
return base.OnDisconnected(stopCalled);
}
和我已经实现的javascript将用户添加到表格中 -
shapeMoveHub.client.userConnected = function (userName) {
$("table").append("<tr><td>" + userName + "</td></tr>");
};
shapeMoveHub.client.userDisconnected = function (userName) {
for(var row=0;row<$("table").rows.length;row++)
{
var rowData='';
for(var col=0;col<$("table").rows[row].cells.length;col++)
{
rowData = $("table").rows[row].cells[col].innerHTML;
}
if (rowData.indexOf(userName))
$("table").deleteRow(row);
}
};