Search code examples
c#.netsignalrsignalr-hub

I do not receive message sent to SignalR Group


I have a functioning SignalR hub that I added Groups to in order to better control messaging, seemed very simple except that no messages are received by anyone in the group. I'm using SignalR for asp.net (not Core) v2.4.1 (latest stable release). My hub code is:

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);
        }

    }
}

I set breakpoints and see that users are being added to the groups (I assume, as no errors are generated) and that the message is being sent correctly to the company/section, yet nothing is received by the client. What am I missing?


Solution

  • Apparently addChatMessage is no longer the method one uses to send a message to a group. I changed addChatMessage to broadcastMessage and the hub works exactly as I need it to.