2014-08-14 4 views
0

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

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

иметь вас Пробовал вызывать 'registerClientMethods' перед' connection.hub.start'? –

+0

Я пробовал это, но это не помогло. Клиентские методы не вызываются. Раньше он работал, прежде чем я начал использовать ChatRooms. – renakre

ответ

0

На самом деле, Эль-Бруно alreaad предоставил решение: 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; 
     }); 


    }); 
1

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

Пример из моей работы прямо

// 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; 
      } 
     }); 
    }); 
+0

После того, как я внедрил ChatRoom, он фактически прекратил работать. Возможно, что-то не так с новым кодом, хотя, когда я отлаживаю, все выглядит отлично, за исключением того, что клиентские методы не запускаются. – renakre