SignalR не вызывает методы клиента с сервера

0

Я добавляю все свои клиентские методы, прежде чем позвонить.start().

То, что я делаю, это загрузить проводку всех клиентских методов, и у меня есть setTimeout в течение 5 секунд, чтобы на самом деле вызвать.start(), поэтому я знаю, что весь мой клиентский скрипт подключен.

По какой-то причине сценарий подключается, но не будет называться сервером.

Теперь я могу без проблем запускать методы сервера, мне просто нужен сервер для передачи этого сообщения клиентам, через клиентский скрипт.

Можно ли разместить клиентский скрипт внутри именованных объектов функции?

Я удалил много кода, чтобы он был читабельным.

Это работает, потому что я вызываю сервер.

$.connection.hub.proxies.collaboratorhub.server.sendMsg

-

Это не работает, потому что я жду на сервере отправки клиенту его сообщения

 $.connection.hub.proxies.collaboratorhub.client.receiveMsg 

знак равно

На стороне сервера при отладке я получаю sentMsg от клиента к серверу, и receiveMsg вызывается с сервера, но он никогда не делает его клиенту.

    function ChatBox(collaboratorMenuItem) {

    var 
        sendMsg = function (ev) {
            // If the user has pressed enter

            if (ev.keyCode === 13) {

                if (this.value.trim() === '') { return false; };

                var avatar = attendees.querySelector('.' + meAttendee.profile.UserID);
                if (avatar) {

                    chats.appendChild(
                           docCreateAttrs('div', { 'class': 'collabChat', innerHTML: this.value }).addChild(avatar.cloneNode(true))
                           );
                } else {
                    chats.appendChild(
                          docCreateAttrs('div', { 'class': 'collabChat', innerHTML: this.value })
                          );
                };

                $.connection.hub.proxies.collaboratorhub.server.sendMsg({ msg: this.value });

                this.value = '';
                return false;
            } else { return true; };
        },



    debugger
    //Callbacks that are called from the server. Not intended for local function calls
    $.connection.hub.proxies.collaboratorhub.client.receiveMsg = function (cmsg) {

        var avatar = attendees.querySelector('.' + cmsg.uid);
        if (avatar) {

            chats.appendChild(
                   docCreateAttrs('div', { 'class': 'collabChat', innerHTML: cmsg.msg }).addChild(avatar.cloneNode(true))
                   );
        } else {
            chats.appendChild(
                  docCreateAttrs('div', { 'class': 'collabChat', innerHTML: cmsg.msg })
                  );
        };
    };
    $.connection.hub.proxies.collaboratorhub.client.addCurrAttendee = function (attendee) {

        debugger
        addAttendee(attendee);
    };
    $.connection.hub.proxies.collaboratorhub.client.joined = function (attendee) {
        debugger
        addAttendee(attendee);

        //let the new attendee know about you
        if (attendee.cnnid !== meAttendee.cnnid) {
            meAttendee.newbieid = attendee.cnnid;
            //
            this.server.addMeNewbie(meAttendee);
        };
    };
    $.connection.hub.proxies.collaboratorhub.client.rejoined = function (attendee) {
        debugger
        //console.log('Re joined : ' + attendee.cnnid);
        addAttendee(attendee);

        //let the new attendee know about you
        if (attendee.cnnid !== meAttendee.cnnid) {

            meAttendee.newbieid = attendee.cnnid;
            this.server.addMeNewbie(meAttendee);
        };
    };
    $.connection.hub.proxies.collaboratorhub.client.gone = function (attendee) {
        // console.log('gone : ' + attendee.cnnid);
        removeAttendee(attendee);
    };

    collaboratorMenuItem.onclick = function (e) {
        //debugger
        if (!chatBox.parentNode) {
            var xy = e.target.getBoundingClientRect();

            document.body.appendChild(chatBox.setGX(null, xy.left).setGY(null, xy.height));
            $(chatBox).draggable({ handle: chatHead, cursor: "move" }).css('position', 'absolute').resizable();
        } else {
            removeChat();
        };
    };

    return {
        chatBox: chatBox,
        attendLk: attendLk,
        addAttendee: addAttendee,
        removeAttendee: removeAttendee,
        removeChat: removeChat
    };
};

--This как создать имя функции с именем collaborateManager, что когда экземпляр имеет свойство вызова this.chatBox и это где все клиентский сценарий загружается вверх, с-в ChatBox.

CollatorMenuItem - это просто div, который расположен рядом с ChatBox.

  function collaborateManager(collaboratorMenuItem) {



                this.chatBox = new ChatBox(collaboratorMenuItem);


    }


    return {
        hideCollaborator: hideCollaborator,
        showCollaborator: showCollaborator,
        getCollaborator: getCollaborator,
        removeCollaboratorCollaborators: removeCollaborator
    };

И в другом глобальном файле JS я запускаю соединение через пять секунд.

document.bindReady(function () {

setTimeout(function () {

    //Global SignalR Connections State

    var cnnStateChanged = function (change) {

        if (change.newState === $.signalR.connectionState.reconnecting) {
            console.log('Re-connecting');
        }
        else if (change.newState === $.signalR.connectionState.connected) {

            console.log('The server is online');
        }
        else if (change.newState === $.signalR.connectionState.disconnected) {

            console.log('The server is offline');
        };
    },
     cnnReconnected = function (change) {

         if (change && change.newState === $.signalR.connectionState.reconnected) {

         };
         console.log('The server is re-connected');
     };
    //------------------------------------------------------------------------------------------------------------
    //Global start SignalR connectio

    $.connection.hub.stateChanged(cnnStateChanged);
    $.connection.hub.reconnected(cnnReconnected);

    if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
        $.connection.hub.start().done(function () {

            //debugger
            // onConnected();
        });
    } else {
        //debugger
        // onConnected();
    };

},5000);

});


Соединение запускается правильно каждый раз, это не проблема, я могу также отправлять сообщения сервера, мне нужно иметь возможность получать эти сообщения.

Вот моя sendMsg на стороне сервера, которая вызывается, но ни один клиент никогда не получает acceptMsg()

  public Task sendMsg(Cmsg cmsg)
    {
        string pid = this.Context.QueryString["pid"],
               uid = this.Context.QueryString["uid"];
        //
        cmsg.cnnid = Context.ConnectionId;
        cmsg.uid = uid;
        //614

        return Clients.OthersInGroup(pid).receiveMsg(cmsg);
    }

Какие-либо предложения? Я делаю это неправильно?

  • 0
    Мне нужна помощь в этом сразу, если кто-то может помочь, это было бы здорово. Бросай мне кость.
  • 0
    Мне удалось заставить его работать, но я должен поместить все элементы запуска, как в .start (), непосредственно под событиями клиента, которые подключены, что не идеально. Я возлагал надежды на два разных типа чатов на одной странице, мыслительный процесс заключался в том, чтобы соединить все клиентские вещи, а затем, когда я узнал, что все это загружено, вызовите .start (), и я должен быть готов. Если кто-то не может показать мне, что я действительно не делаю это правильно, я чувствую запах нескольких iFrames. И, о, как я люблю эти маленькие противные кадры.
Теги:
signalr

1 ответ

0

Попробуйте изменить код на стороне сервера, чтобы:

public Task sendMsg(Cmsg cmsg)
{
   string pid = this.Context.QueryString["pid"],
   uid = this.Context.QueryString["uid"];
   //
   cmsg.cnnid = Context.ConnectionId;
   cmsg.uid = uid;
   //614
   return Clients.Caller.OthersInGroup(pid).receiveMsg(cmsg);
}

Добавление вызывающего абонента в: возврат клиентов. Caller.OthersInGroup(pid).receiveMsg(cmsg);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню