Частный чат SignalR не возвращает данные - PullRequest
0 голосов
/ 14 декабря 2018

Я внедрил SignalR в свой проект.Но у меня проблема с отправкой личного сообщения.Я отправляю 'toConnectionID' со страницы.

ChatHub.cs

public void LoadPrivateMessages(string toUserName,string toConnectionID)
        {
            var chatHub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();             
            string fromUserName = Context.QueryString["userName"].ToString();
            string fromConnectionID = Context.ConnectionId;

            List<ChatMessageDetail> currentMessages = cachePrivateMessages.Where(x => x.ToUserName == toUserName && x.FromUserName == fromUserName && x.ToConnectionID==toConnectionID && x.FromConnectionID==fromConnectionID).ToList();


            chatHub.Clients.Client(toConnectionID).privateMessagesHistory(currentMessages);

        }

Мой текущий список сообщений заполняется.Я в порядке здесь.Но я не могу пересылать сообщения на страницу.

Javascript

chatHub.client.privateMessagesHistory = function (data) {
                console.log(data);

            };

Мой экран консоли имеет нулевое значение после этого кода JavaScript.

Редактировать:

Это мой код подключения в функции document.ready.Второй - отправка информации о получателе.

var chatHub = $.connection.chatHub;
            $.connection.hub.qs = { "userName": "@Session["userName"]" };
        $.connection.hub.start().done(function () {
            console.log("Connection OK !");
        });


 $(document).on('click','.onlineUser', function () {
            var userName = $(this).attr('id');//That is which user to send(Receiver)
            var toConnectionID = $(this).attr('connectionID');
            chatHub.server.loadPrivateMessages(userName, toConnectionID);
            $('.privateMessagediv').show();
            $('.userName').html("");
            $('.userName').append("<h4>" + userName + "</h4>");
            $('.btnSendingPrivateMessage').attr('id', userName);
            $('.btnSendingPrivateMessage').attr('connectionid', toConnectionID);

            chatHub.client.privateMessagesHistory = function (data) {
                $('#privateChatBox').append(data);

            };
        });

Редактировать 2:

Я решил проблему.

chatHub.Clients.Client(fromConnectionID).privateMessagesHistory(currentMessages);

вместо

chatHub.Clients.Client(toConnectionID).privateMessagesHistory(currentMessages);

1 Ответ

0 голосов
/ 14 декабря 2018

Мое первоначальное подозрение было с toConnectionId, но после проверки вашей privateMessageHistory регистрации обратного вызова, скорее всего, возникла проблема с синхронизацией.

Вам необходимо настроить клиентский обратный вызов перед концентратором .start().

От Microsoft:

Обычно вы регистрируете обработчики событий перед вызовом метода start для установления соединения.Если вы хотите зарегистрировать некоторые обработчики событий после установления соединения, вы можете сделать это, но вы должны зарегистрировать хотя бы один из ваших обработчиков событий перед вызовом метода запуска

Нет необходимостиразместите регистрацию обратного вызова в событии click.

var chatHub = $.connection.chatHub;
$.connection.hub.qs = { "userName": "@Session["userName"]" };
// callback first
chatHub.client.privateMessagesHistory = function (data) {
    $('#privateChatBox').append(data);
};
// start the hub connection - note chatHub is different from your .hub
chatHub.start().done(function () {
    console.log("Connection OK !");
});
...