简体   繁体   中英

Private message not send in SignalR

I am working on a very simple project where a user sends a private message to another through the server using the SignalR library. I used this code as a base https://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room

I started with an easy functionality test but my recipient is not receiving the message and It doesn't work properly, can you help me understand why?

In my program usernames are generated dynamically in the session, those in the code below are not real data, I just used them for the example

Client side

    </script>
    <script type="text/javascript" src="/Scripts/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="/Scripts/jquery.signalR-1.2.2.js"></script>
    <script type="text/javascript" src="/signalr/hubs"></script>
    <script type="text/javascript">
        $(function () {
            var chatHub = $.connection.chatHub;
            console.log('connected')

            chatHub.client.messageReceived = function (userName, message) {
                alert("You have a new message");
            }

            $.connection.hub.start().done(function () {
                chatHub.server.connect('FromUsername');

                $('#btnSend').click(function () {
                    var userId='ToUsername'
                    var msg = 'Test';
                    chatHub.server.sendPrivateMessage(userId, msg);
                });
            });
        });
    </script>

Server side

public class ChatHub : Hub
    {
        #region Data Members

        static List<UserDetail> ConnectedUsers = new List<UserDetail>();
        static List<MessageDetail> CurrentMessage = new List<MessageDetail>();

        #endregion

        #region Methods

        public void Connect(string userName)
        {
            var id = Context.ConnectionId;


            if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
            {
                ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = userName });

                // send to caller
                Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage);

                // send to all except caller client
                Clients.AllExcept(id).onNewUserConnected(id, userName);

            }

        }

        public void SendMessageToAll(string userName, string message)
        {
            // store last 100 messages in cache
            AddMessageinCache(userName, message);

            // Broad cast message
            Clients.All.messageReceived(userName, message);
        }

        public void SendPrivateMessage(string toUserId, string message)
        {

            string fromUserId = Context.ConnectionId;

            var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId) ;
            var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId);

            if (toUser != null && fromUser!=null)
            {
                // send to 
                Clients.Client(toUserId).sendPrivateMessage(fromUserId, fromUser.UserName, message); 

                // send to caller user
                Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message); 
            }

        }

        public override System.Threading.Tasks.Task OnDisconnected()
        {
            var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            if (item != null)
            {
                ConnectedUsers.Remove(item);

                var id = Context.ConnectionId;
                Clients.All.onUserDisconnected(id, item.UserName);

            }

            return base.OnDisconnected();
        }


        #endregion

        #region private Messages

        private void AddMessageinCache(string userName, string message)
        {
            CurrentMessage.Add(new MessageDetail { UserName = userName, Message = message });

            if (CurrentMessage.Count > 100)
                CurrentMessage.RemoveAt(0);
        }

        #endregion
    }

When I execute the program it shows log "connected" on the console and the event fires when button is pressed but for some reason the message is not sent or not being received

What are you missing in your code is to start to listen to your server, what that method send to you like

.on("YourMethodName")

after the connection is made. Also is recommended to resolve users with connectionId, you you can call a specific user like:

Clients.Client(Context.ConnectionId).sendPrivateMessage(fromUserId, fromUser.UserName, message);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM