【问题标题】:Unable to send message to groups in SignalR无法向 SignalR 中的组发送消息
【发布时间】:2016-09-14 21:32:00
【问题描述】:

我在聊天应用程序中使用 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);
};

谁能提出解决方案?

谢谢。

【问题讨论】:

  • 什么是 UsersOnline,您确定您获得了正确的 groupName 并且该组不为空吗?
  • @Pawel UsersOnline 是一个包含静态 List 的类,用于添加和删除用户。是的,组名已正确分配给用户,但仍无法传递消息。
  • 如何将客户添加到组中? - 显示客户端和服务器代码。
  • @Pawel 请检查上面的更新代码。
  • 我仍然看不到调用AddUsersToGroup 的代码以及为用户设置 ConnectionId 的代码。也不知道为什么你有多个 ConnectionIds 给一个用户 - 你总是只使用一个/第一个 id。

标签: javascript c# signalr


【解决方案1】:

不要使用 gethashcode 生成组名,只有当用户的所有数据都相同时才会匹配,并且如果出现断开连接,或者连接id更改组名将不再有效对于那个用户。您可以使用 ConnectionId,因为它对每个用户都是唯一的。 Pawel 也是正确的,您正在创建组,但您没有将用户添加到组本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2016-04-14
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多