Я не получаю сообщение, отправленное в SignalR Group - PullRequest
0 голосов
/ 07 января 2020

У меня есть функционирующий концентратор SignalR, в который я добавил группы, чтобы лучше контролировать обмен сообщениями, казалось очень простым, за исключением того, что никто из группы не получает никаких сообщений. Я использую SignalR для asp. net (не Core) v2.4.1 (последняя стабильная версия). Мой код хаба:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;
using SignalrHub;
using System.Data;

namespace SignalRChat
{
    public class ChatHub : Hub
    {

        private static readonly List<User> Users = new List<User>();

        public async override Task OnConnected()
        {

            string userName = Context.QueryString["username"];
            string company = Context.QueryString["company"];
            string department = Context.QueryString["department"];
            string section = Context.QueryString["section"];
            string firstname = Context.QueryString["firstname"];
            string lastname = Context.QueryString["lastname"];
            string connectionId = this.Context.ConnectionId;

            var user = new User();
            user.Name = userName;
            user.firstname = firstname;
            user.lastname = lastname;
            user.company = company;
            user.department = department;
            user.section = section;
            user.ConnectionIds = connectionId;

            await JoinRoom(company.ToUpper()); // There's always a company, join the company room
            if (section != "")
            {
                // If there's a section, join section room
                await JoinRoom(company.ToUpper() + department.ToUpper() + section.ToUpper()); 
            }

            try
            {
                Users.Add(user);
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
            }

            // TODO: Broadcast the connected user

            // send list of connected users to client
            // SendOne(connectionId,userName,"Welcome " + userName + System.Environment.NewLine + "Connected users are:" + System.Environment.NewLine);

            string connectMessage = "";

            foreach (var display in Users)
            {
                if (display.Name != userName)
                {
                    connectMessage = connectMessage + display.Name + System.Environment.NewLine;
                }
            }
            if (connectMessage == "")
            {
                connectMessage = "None";
            }
            SendOne(connectionId, userName, "Welcome " + userName + System.Environment.NewLine + "Connected users are:" + System.Environment.NewLine + connectMessage);
            // SendOne(connectionId, userName, "This is to a specific user.");

            // return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopped)
        {

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

            var item = Users.Find(x => x.ConnectionIds == connectionId);

            LeaveRoom(item.company.ToUpper()); // Leave company room
            LeaveRoom(item.compny.ToUpper() + item.department.ToUpper() + item.section.ToUpper()); // Leave Section Room

            Users.Remove(item); // remove from users

            return base.OnDisconnected(true);
        }

        public void SendOne(string connectionId, string userName, string message)
        {

            Clients.Client(connectionId).broadcastMessage(userName, message);

        }

        public void Send(string name, string message)
        {
            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(name, message);
        }

        public void messageSection(string company, string department, string section, string name, string message)
        {
            string GroupName = company.ToUpper() + department.ToUpper() + section.ToUpper();
            Clients.Group(GroupName).addChatMessage(name, message);

        }

        public void messageCompany(string company, string name, string message)
        {
            try
            {
                Clients.Group(company.ToUpper()).addChatMessage(name, message);
            }
            catch (Exception ex)
            {
                string errormsg = ex.Message;
            }

        }

        public List<string> getConnectedUsers()
        {
            List<string> UserNames = new List<string>();

            foreach (var ConnectedUser in Users)
            {
                UserNames.Add(ConnectedUser.Name + ": " + ConnectedUser.firstname + " " + ConnectedUser.lastname);
            }
           return UserNames;
        }

        public List<string> getConnectedSectionUsers(string company, string department, string section, string username)
        {
            List<string> UserNames = new List<string>();


            foreach (var ConnectedUser in Users)
            {
                if (ConnectedUser.company.ToUpper() == company.ToUpper() && ConnectedUser.department.ToUpper() == department.ToUpper() && ConnectedUser.section.ToUpper() == section.ToUpper())
                {
                    if (username.ToUpper() != ConnectedUser.Name.ToUpper())
                    {
                        UserNames.Add(ConnectedUser.Name + ": " + ConnectedUser.firstname + " " + ConnectedUser.lastname);
                    }
                }
            }
            return UserNames;
        }

        public async Task JoinRoom(string roomName)
        {
            await Groups.Add(Context.ConnectionId, roomName);
        }

        public Task LeaveRoom(string roomName)
        {
            return Groups.Remove(Context.ConnectionId, roomName);
        }

    }
}

Я установил точки останова и вижу, что пользователи добавляются в группы (я полагаю, что ошибки не генерируются) и что сообщение корректно отправляется в компанию / раздел пока клиент ничего не получил. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Очевидно, addChatMessage больше не метод, используемый для отправки сообщения группе. Я изменил addChatMessage на broadcastMessage и концентратор работает именно так, как мне нужно.

0 голосов
/ 08 января 2020

Ваш addChatMessage не указан в вашем коде, и, поскольку вы сказали, что это ничего не делает, попробуйте следующее:

this.Clients.Group(GroupName).SendAsync(name, message);
...