我在聊天应用程序中使用SignalR 2.2.1。
我正在将用户添加到群组并向群组发送消息。在发送消息时,我正在从用户对象中获取组名,如下所示。
我无法向群组发送消息,而向呼叫者或所有客户端发送消息可以正常工作。
服务器端代码:
public string AddUsersToGroup(string CurrentUserId, string toUserId)
{
string strGroupName = GetUniqueGroupName(CurrentUserId, toUserId);
if (!string.IsNullOrEmpty(toUserId) && !string.IsNullOrEmpty(CurrentUserId))
{
string _cnId, _toCnId;
_cnId = UsersOnline.userObj.Where(item => item.userId == CurrentUserId).Select(item => item.ConnectionIds.FirstOrDefault()).FirstOrDefault();
_toCnId = UsersOnline.userObj.Where(item => item.userId == toUserId).Select(item => item.ConnectionIds.FirstOrDefault()).FirstOrDefault();
UsersOnline.userObj.Where(item => item.userId == CurrentUserId).FirstOrDefault().GroupName = strGroupName;
UsersOnline.userObj.Where(item => item.userId == toUserId).FirstOrDefault().GroupName = strGroupName;
Groups.Add(_cnId, strGroupName);
Groups.Add(_toCnId, strGroupName);
}
return strGroupName;
}
public void Send(string message)
{
if (Clients != null)
{
string _conId = Context.ConnectionId;
string GroupName = UsersOnline.userObj.Where(item => item.ConnectionIds.Contains(_conId)).FirstOrDefault().GroupName;
Clients.Group(GroupName).broadcastMessage(message); // This doesn't work.
Clients.All.broadcastMessage(message); // This works.
Clients.Caller.broadcastmessage(message); // This works.
}
}
private string GetUniqueGroupName(string CurrentUserId, string toUserId)
{
return (CurrentUserId.GetHashCode() ^ toUserId.GetHashCode()).ToString();
}
客户端代码:
chat.client.broadcastMessage = function (message) {
$('#divMessageBoard').append('<span>' + $('<div/>').text(message).html() + '</span><br/>');
var divMessageBoard = $('#divMessageBoard');
$("#divMessageBoard").animate({ scrollTop: $("#divMessageBoard")[0].scrollHeight }, 1000);
};
有人可以建议一个解决方案吗?
感谢。
答案 0 :(得分:0)
不要使用gethashcode生成组的名称,只有当用户的所有数据都相同时才会匹配结果,如果断开连接,或者connectid更改,组名将不再有效对于那个用户。您可以使用ConnectionId,因为它对每个用户都是唯一的。另外,Pawel是正确的,您正在创建组,但您没有将用户添加到组本身。