Использовать объект как параметр с SignalR - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь отправить объект с клиента на сервер, а затем с сервера на клиент (ы). Это использует пример кода, предоставленного Microsoft, который я немного изменил, чтобы использовать объект вместо примитива, код приведен ниже. Функция обратного вызова на клиенте никогда не вызывается после соединения connection.send от JS клиента.

Класс хаба

public class Chat : Hub
{
    public void BroadcastMessage(MessageModel message)
    {
        Clients.All.SendAsync("broadcastMessage", message);
    }
}

Класс модели

public class MessageModel
{
    [JsonProperty("to")]
    public string _to = "";

    [JsonProperty("from")]
    public string _from = "";

    [JsonProperty("message")]
    public string _message = "";

    public MessageModel(string to, string from, string message)
    {
        _to = to;
        _from = from;
        _message = message;
    }
}

Клиентская сторона JS (где, я думаю, проблема ...)

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1.0.0/dist/browser/signalr.min.js">

function onConnected(connection) {
            console.log('connection started');
            //connection.send('broadcastMessage', '_SYSTEM_', username + ' JOINED');

            document.getElementById('sendmessage').addEventListener('click', function (event) {
                // Call the broadcastMessage method on the hub.
                if (messageInput.value) {
                    var msgObject = { to: 'Sally', from: 'Jonny', message: 'this is message' };
                    var myJSON = JSON.stringify(msgObject);
                    console.log(myJSON);

                    //neither object or stringify work
                    connection.send('broadcastMessage', msgObject);
                }

                // Clear text box and reset focus for next comment.
                messageInput.value = '';
                messageInput.focus();
                event.preventDefault();
            });
        }

function bindConnectionMessage(connection)
        {
            var messageCallback = function (message)
            {
                console.log('Never hits here...');

                if (!message) return;

                // Html encode display name and message.
                var encodedName = message.from;
                var encodedMsg = message.message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
                var messageEntry = createMessageEntry(encodedName, encodedMsg);

                var messageBox = document.getElementById('messages');
                messageBox.appendChild(messageEntry);
                messageBox.scrollTop = messageBox.scrollHeight;
            };

            // Create a function that the hub can call to broadcast messages.
            connection.on('broadcastMessage', messageCallback);
            connection.on('echo', messageCallback);
            connection.onclose(onConnectionError);
        }

Я занимаюсь этим целую вечность и не могу понять, почему это так сложно. Я подозреваю, что это что-то действительно очевидное, но может действительно помочь. Спасибо!

1 Ответ

0 голосов
/ 19 февраля 2020

Я считаю, что вы должны использовать метод Invoke с Send, например:

connection.invoke('BroadcastMessage', msgObject);

Примечание: имя метода чувствительно к регистру, поэтому, если ваш концентратор имеет BroadcastMessage на клиенте он должен быть таким же, а не broadcastMessage.

...