как убедиться, что клиентские методы зарегистрированы до запуска концентратора (SignalR 1.0)

Я новичок в SignalR, хотя у меня был большой опыт в течение недели. Насколько я понимаю, перед запуском хаба клиентские методы должны быть зарегистрированы. В противном случае клиентские методы, такие как «onConnected» или «onDisconnected», не будут запущены, что является проблемой, с которой я столкнулся сейчас. Я работаю над написанием приложения для чата. Я могу подключиться к концентратору и отправлять текстовые сообщения, а другие пользователи в комнате могут получать сообщения. Однако клиентские методы не вызываются. Хотя я думаю, что регистрирую их до запуска Hub, но onConnected и другие методы клиента не срабатывают. Вот код:

Файл Chat.aspx:

$(function () {
        // Declare a proxy to reference the hub.
        var chatHub = $.connection.chatHub;
        registerClientMethods(chatHub); // <-this is where I register client methods

        $.connection.hub.start(function () {

            var roomName = $('#hdn_Roomid').val();
            var userName = $('#hdn_NameSurname').val();

            $('#hdSelectedRoom').val(roomName);
            chatHub.server.joinRoom(roomName, userName);
        });

        // Start Hub
        $.connection.hub.start().done(function () {

            //this sets up the groupchat window, and load students            
            registerEvents(chatHub);

            var name = $('#hdn_NameSurname').val();
            chatHub.server.connect(name);
            var a = 0;
        });


    });

    function registerEvents(chatHub) {
        $('#btn_SendGroupChat').live("click", function () {

            var msg = $("#txt_InputGroupChat").val();
            if (msg.length > 0) {

                var userName = $('#hdn_NameSurname').val();
                var roomname = $('#hdSelectedRoom').val();

                chatHub.server.send(msg, roomname, userName);
                ..............
            }
        });
    }

    function registerClientMethods(chatHub) { // <-- These methods are never fired

        // Calls when user successfully logged in
        chatHub.client.onConnected = function (id, userName, allUsers, messages) {

            ......
        }

        // On New User Connected
        chatHub.client.onNewUserConnected = function (id, name) {
            //AddUser(chatHub, id, name);
        }

        // On User Disconnected
        chatHub.client.onUserDisconnected = function (id, userName) {

            //var userName = $('#hdn_NameSurname').val();
            var roomname = $('#hdSelectedRoom').val();

            chatHub.server.leaveRoom(roomname, userName);

            .............

        }

        chatHub.client.messageReceived = function (userName, message) {

            AddMessage(userName, message);
        }
    }

Файл ChatHub.cs:

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 Send(string msg, string room, string userName)
    {
        Clients.Group(room).addMessage(msg, room);
        Clients.Group(room).messageReceived(userName, msg);
    }

    public void JoinRoom(string roomName, string userName)
    {
        Groups.Add(Context.ConnectionId, roomName);

        string msg = "<div class='text-muted'>" + userName + " joined the chat.</div>";
        Clients.Group(roomName).addMessage(msg, roomName);
        Clients.Group(roomName).messageReceived(userName, msg);
    }

    public void LeaveRoom(string roomName, string userName)
    {
        Groups.Remove(Context.ConnectionId, roomName);
        string msg = "<div class='text-muted'>" + userName + " quit the chat.</div>";
        Clients.Group(roomName).addMessage(msg, roomName);
        Clients.Group(roomName).messageReceived(userName, msg);
    }

    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();
    }

person renakre    schedule 14.08.2014    source источник
comment
Вы пытались позвонить registerClientMethods до connection.hub.start ?   -  person sa_ddam213    schedule 14.08.2014
comment
Я пробовал это, но это не помогло. Методы клиента не вызываются. Это работало до того, как я внедрил ChatRooms.   -  person renakre    schedule 14.08.2014


Ответы (3)


Вы должны просто иметь возможность регистрировать все клиентские события перед вызовом start.

Пример из моего рабочего чата

   // Chat
    var chat = $.connection.chatHub;
    chat.client.broadcastMessage = function (chatdata) {
        var encodedName = htmlEncode(chatdata.Sender);
        var encodedMsg = htmlEncode(chatdata.Message);
        var msgClass = 'chatmessage'

        // if the message is for this user highlight
        if (encodedMsg.indexOf("@@" + $('#displayname').val()) > -1) {
            msgClass = 'chatusermessage'
        }
        $('#discussion').append(String.format('<tr><td class="{0}"><strong onclick="populatechatname(\'{1}\');">{1}: </strong>{2}</td></tr>', msgClass, encodedName, emotify(encodedMsg)));
        $('#chat').scrollTop($('#chat')[0].scrollHeight);
        $('#chatcount').html('Users Online: ' + chatdata.OnlineCount);
    };


    // Start the connection.
    $.connection.hub.start().done(function () {

        chat.server.getMessages()
        $('#sendmessage').click(function () {
            // Call the Send method on the hub. 
            chat.server.send($('#displayname').val(), $('#message').val());
            $('#message').val('').focus();
        });
        $('.message').keydown(function (event) {
            if (event.keyCode == 13) {
                chat.server.send($('#displayname').val(), $('#message').val());
                $('#message').val('').focus();
                return false;
            }
        });
    });
person sa_ddam213    schedule 14.08.2014
comment
После того, как я внедрил ChatRoom, он фактически перестал работать. Возможно, что-то не так с новым кодом, хотя при отладке все выглядит нормально, за исключением того, что клиентские методы не запускаются. - person renakre; 14.08.2014

Исправлено в новой версии

Обратите внимание, что в новой версии SignalR для AspNetCore (той, которая больше не использует jquery) это больше не проблема. Это совершенно другой API, поэтому, если вы используете его в течение нескольких лет, это не просто замена.

Я думал, что где-то это читал, но только что проверил с помощью вызова setTimeout, который зарегистрировал обработчик событий, и сообщения пришли постфактум.

Раньше это было огромной болью, поэтому я очень рад, что это изменилось.

person Simon_Weaver    schedule 19.01.2019

На самом деле, Эль Бруно уже предоставил решение: hub-2/" rel="nofollow">http://elbruno.com/2014/07/25/signalr-error-html-client-does-not-raise-onconnected-method-on-server-hub-2 /

Вот рабочий код для тех, у кого похожая проблема:

var chatHub;

    $(window).ready(function () {
    //$(function () {
        // Declare a proxy to reference the hub.
        var chatHub = $.connection.chatHub;

        registerClientMethods(chatHub);

        chatHub.client.foo = function () { }; // **This line solved the issue

        // Start Hub
        $.connection.hub.start().done(function () {

            var roomName = $('#hdn_Roomid').val();
            var userName = $('#hdn_NameSurname').val();

            $('#hdSelectedRoom').val(roomName);
            chatHub.server.joinRoom(roomName, userName);

            //this sets up the groupchat window, and load students            
            registerEvents(chatHub);

            var name = $('#hdn_NameSurname').val();
            chatHub.server.connect(name);
            var a = 0;
        });


    });
person renakre    schedule 14.08.2014