【问题标题】:Messages are not sent to groups signalr消息不会发送到组信号器
【发布时间】:2015-08-19 14:12:00
【问题描述】:

在信号器中的消息有些问题,无法与组合作,所以当它具有这种形式时它可以工作:

Clients.All.received(new { sender = sender, message = message, isPrivate = false });

在我的项目中,我有房间,所以当我尝试向群组发送消息时,它们不会显示在页面上:

Clients.Group(chatuser.CurrentGroup).received(new { sender = sender, message = message, isPrivate = false });

这里是javascript的一小部分:

chatHub.client.received = function (message) {
        viewModel.messages.push(new Message(message.sender, message.message, message.isPrivate, 'normalMessage'));
    };

如果您需要查看更多代码,请告诉我,我会更新我所有的 chathub 代码并使用完整的 javascript 文件为它建模。

更新 2。 聊天用户:

public ChatUser(string group) {
    CurrentGroup = group;
}

public ChatUser()
    : this("Lobby")
{

}

public string nameOfGroup { get; set; }
public int authorID { get; set; }

public List<string> chatGroup { get; set; }
public string CurrentGroup { get; set; }

public string userLogin { get; set; }
public HashSet<string> ConnectionIds { get; set; }

Chathub.cs

private void SendGroupMessage(ChatUser user, string message)
    {
        Clients.Group(user.CurrentGroup).received(user.userLogin, message);
    }

public void Send(string message)
{
    var user = GetUser(Context.User.Identity.Name);   
    SendGroupMessage(user, message);
}
public override Task OnConnected()
{

    string userName = Context.User.Identity.Name;
    string connectionId = Context.ConnectionId;

    var user = chatUsers.GetOrAdd(userName, _ => new ChatUser
    {
        userLogin = userName,
        ConnectionIds = new HashSet<string>()
    });

    lock (user.ConnectionIds)
    {

        user.ConnectionIds.Add(connectionId);

        // Or you might want to only broadcast this info if this
        // is the first connection of the user
        if (user.ConnectionIds.Count == 1)
        {

            Clients.Others.userConnected(userName);
        }
    }

    return base.OnConnected();
}

public Task JoinGroup(string groupName)
{
    var user = GetUser(Context.User.Identity.Name);
    string connectionGrpToString = user.ConnectionIds.ToString();

    //Join new Group
    user.CurrentGroup = groupName;
    //await
    return Groups.Add(connectionGrpToString, user.CurrentGroup);
}

public Task LeaveRoom(string roomName)
{
    var user = GetUser(Context.User.Identity.Name);
    string connectionGrpToString = user.ConnectionIds.ToString();
    var oldGroup = user.CurrentGroup;

    //Tell everyone user is leaving
    var message = string.Format("{0} has left.", user.userLogin);
    SendGroupAlert(user, message);

    //remove user from the group
    //await
    return Groups.Remove(connectionGrpToString, oldGroup); ;
}

重做的 Chat.js 的一小部分:

function Message(from, msg, template) {
    this.from = ko.observable(from);
    this.message = ko.observable(msg);
    this.template = ko.observable(template);
}

    chatHub.client.received = function (sender, message) {
        // Add the message to the page.
        viewModel.messages.push(new Message(sender, message, 'normalMessage'));
    };

chat.cshtml 的视图:

<div class="col-md-12">
    <div class="form-search">
        <input type="text" id="txtMsg" class="input-xxlarge" disabled="disabled" placeholder="send" />
        <button type="button" id="btnSend" class="btn btn-info" disabled="disabled">Send</button>
    </div>
</div>
<div class="col-md-10">
    <ul id="normalMessage" data-bind="foreach: messages">
        <li>
            <strong><span data-bind="text: from"></span>: </strong>
            <span data-bind="text: message"></span>
        </li>
    </ul>
</div>

更新 3。 也许我错过了一些东西,但也显示了房间页面的代码以及它如何重定向我,我还发现当我选择我想加入的房间时,它会转到方法 JoinGroup 和参数 @ 987654329@ 它正确显示了我选择的内容,但是当我要发送消息后,在 user.CurrentGroup 它显示默认大厅..

Rooms.cshtml:

<div id="nav">
    <div id="rooms" class="well well-small">
        <ul class="nav nav-list">
            <li class="nav-header">Rooms</li>
            @foreach (var item in Model)
            {
                <li data-value=@item.Name>@Html.ActionLink("Room: " + item.Name, "Chat", "Home")</li>
            }
        </ul>
    </div>
</div>

以及我如何在 chat.js 中加入它:

    var roomKey = $(this).data('value');
    chatHub.server.joinGroup(roomKey);

【问题讨论】:

  • 你们是如何建立小组的?请分享您的OnConnected 方法。另外,chatuser.CurrentGroup 是什么?请分享此值
  • 发布您将用户分配到组的代码。
  • 我已经更新了我的代码,抱歉花了这么长时间才回复,@salniro 我还有另一个显示房间列表的页面。 'chatuser.CurrentGroup' 存储我当前加入的组,我在 ChatUser 模型中声明它。
  • @AnikIslamAbhi 已经发布了 :)
  • @salniro 我发现了一个新错误,请在线程中检查。

标签: javascript asp.net-mvc asp.net-mvc-4 knockout.js signalr


【解决方案1】:

我认为你的问题是这部分,问题是逻辑错误

public Task JoinGroup(string groupName)
{
    var user = GetUser(Context.User.Identity.Name);
    string connectionGrpToString = user.ConnectionIds.ToString();

    //Join new Group
    user.CurrentGroup = groupName;
    //await
    return Groups.Add(connectionGrpToString, user.CurrentGroup);
}

在这里您的 fetech 用户信息,然后将组名分配到其中,然后将用户添加到该组。

一切都很好,但您忘记使用组名更新您的用户列表。

您指定组名

    //Join new Group
    user.CurrentGroup = groupName;

但在您的列表中,用户仍然没有组名

    //Join new Group
    user.CurrentGroup = groupName;

当您从GetUser 拉入发送方法中的用户时

public void Send(string message)
{
    var user = GetUser(Context.User.Identity.Name);   
    SendGroupMessage(user, message);
}  

找不到用户的组名,因为您没有更新用户列表中的组名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2022-01-27
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多