簡體   English   中英

私信未在 SignalR 中發送

[英]Private message not send in SignalR

我正在做一個非常簡單的項目,用戶使用 SignalR 庫通過服務器向另一個用戶發送私人消息。 我將此代碼用作基礎https://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room

我從一個簡單的功能測試開始,但我的收件人沒有收到消息並且它不能正常工作,你能幫我理解為什么嗎?

在我的程序中用戶名是在session中動態生成的,下面代碼中的不是真實數據,我只是用它們來舉例

客戶端

    </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>

服務器端

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
    }

當我執行程序時,它會在控制台上顯示日志“已連接”,並且在按下按鈕時觸發事件,但由於某種原因,消息未發送或未收到

您在代碼中缺少的是開始收聽您的服務器,該方法發送給您的內容喜歡

.on("YourMethodName")

建立連接后。 還建議使用 connectionId 解析用戶,您可以調用特定用戶,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM