2012-09-30 22 views
8

Soy bastante nuevo en SignalR. Mi primera tarea es hacer una aplicación de chat simple.Cómo obtener una lista de clientes conectados en SignalR

He estado navegando y leyendo y finalmente he hecho una página en la que vienes y chateas y funciona bien.

Ahora necesito mostrar una lista de clientes conectados. Para lograr esto, he escrito el siguiente código. Este es mi HUB.

public class ChatHub: Hub 
{ 

    chatEntities dc = new chatEntities(); 
    public void Send(string message,string clientName) 
    { 
     Clients.addMessage(message,clientName); 

    } 

    // I want to save the user into my database, when they join 
    public void Joined(string userId,string userName) 
    { 

     CurrentChattingUsers cu = new CurrentChattingUsers(); 
     cu.ConnectionId = userId; 
     cu.UserName = userName; 

     dc.CurrentChattingUsers.AddObject(cu); 
     dc.SaveChanges(); 


     Clients.joins(userId, userName); 
    } 

    // This will return a list of connected user from my db table. 
    public List<ClientModel> GetConnectedUsers() 
    { 
     var query = (from k in dc.CurrentChattingUsers 
        select new ClientModel() 
        { 
         FullName = k.UserName, 
         UserId = k.ConnectionId 
        }).ToList(); 
     return query; 
    } 


} 

Y eso es ... ¿Y ahora qué? ¿Voy en la dirección correcta? Si soy así, ¿cómo llamar a este método desde la vista? Algunas buenas sugerencias realmente me ayudarán. aplausos

EDIT:

He añadido la siguiente secuencia de comandos cuando el cubo se inicia

$.connection.hub.start(function() { 
      chat.getConnectedUsers(); 

     }); 

Este es el método que devuelve los nombres de los clientes en mi Hub

public List<ClientModel> GetConnectedUsers() 
    { 
     var data = (from k in dc.Users 
        select new ClientModel() 
        { 
         FullName = k.UserName 

        }).ToList(); 

     Clients.loadUsers(data); 
     return data; 
    } 

en Firebug puedo ver que devuelve algo de la siguiente manera;

{"State":{},"Result":[{"FullName":"mokarom","UserId":null}, {"FullName":"aka8000","UserId":null},{"FullName":"johnnyno5","UserId":null},{"FullName":"reza","UserId":null},{"FullName":"amyo","UserId":null},{"FullName":"rezatech","UserId":null}],"Id":"0","Error":null,"StackTrace":null} 

Pero, ¿cómo iba a mostrar eso en mi opinión ??

EDIT:

en su vista por completo hasta el momento

<script type="text/javascript"> 
    var chat; 
    var myClientName 
    $(document).ready(function(){ 

     myClientName = '@Request.Cookies["ChatterName"].Value'; 


     // Created proxy 
     chat = $.connection.chatHub; 
     // Assign a function to be called by the server 
     chat.addMessage = onAddMessage; 

     // Register a function with the button click 
     $("#broadcast").click(onBroadcast); 


     $('#message').keydown(function (e) { 
      if (e.which == 13) { //Enter 
       e.preventDefault(); 

       onBroadcast(); 

      } 
     }); 

     // Start the connection 
     $.connection.hub.start(function() { 
      chat.getConnectedUsers(); 

     }); 

     chat.loadUsers = function (data) { 
      loadUsers(data); 

     }; 
    }); 


    function onAddMessage(message,clientName) { 
     // Add the message to the list 
     $('#messages').append('<div class="chatterName">' + clientName + ' </div><div class="chatterMessage"> ' + message + '</div><div class="clear">'); 

    } 
    function onBroadcast() { 
     // Call the chat method on the server 
     chat.send($('#message').val(), myClientName); 
     $('#message').val(''); 
    } 
    function loadUsers(data) { 
     $('#clientList').html(data.Result[0].FullName); 

    } 
</script> 

Problema: no ver nada aquí:. $ ('# ClientList') html (data.Result [0] .Nombre completo); firebug dice 'los datos no se define'

Respuesta

6

JavaScript

var chats = $.connection.chatHub; 
chats.loadUsers = function (data) { loadUsers(data); }; 
var connectedUserCount = 0; 

$.connection.hub.start(function() 
     { chats.getConnectedUsers(); }); 

function loadUsers = = function (data) { 
    console.log(data); //so you can see your data in firebug.etc 
      //which signal r will have converted to json so you could try 
    var numberOfUsers = data.length; 
} 

Una vez iniciado cubo está chats tendrían todas las funciones públicas de su concentrador disponibles como funciones javascript. Esto es lo que el signalr/hubs crea utilizando el mejor método de conexión disponible entre el cliente y el servidor.

Inversamente su C# hub tendrá acceso a cualquier función de javascripts que configure, p. Ej.

Clients.loadUsers(query); 
//add this to you server side just before you return query 

ps - también se podría considerar el uso OnConnectedAsync, aunque por supuesto es posible que aún persisten estos. También estoy esperando soporte completo para soporte de granja de servidores web usando sql, que está en el pipeline.

+0

Hola, gracias por la respuesta. Intenté exactamente lo que dijiste. Mi método de controlador devuelve '5' y escribí este código a mi vista. $ .connection.hub.start (function() {connectedUserCount = chat.getConnectedUsersCount(); $ ('# clientList'). append ('

  • ' + connectedUserCount + '
  • ');}) ;. . Pero devuelve algo "[object Object]" ... ¿Alguna idea de lo que salió mal? – kandroid

    +0

    Actualizaré la respuesta para algo de eso ahora – dove

    +0

    Ese objeto es su lista.Vea la actualización para contestar y quizás solo intente y comience enviando de regreso un simple poco o valor al cliente para empezar. Toma un poco de tiempo aprender cómo funciona esto. (ps - mi respuesta original tenía dos fallas y aún puede, como estoy pseudo escribiendo esto, no ejecutarlo) – dove

    Cuestiones relacionadas