2012-09-30 23 views
8

Sono abbastanza nuovo per SignalR. Il mio primo compito è quello di creare una semplice app di chat.Come ottenere un elenco di client connessi su SignalR

Ho navigato e letto e finalmente ho creato una pagina in cui vieni a chattare e funziona bene.

Ora ho bisogno di mostrare un elenco di client collegati. Per raggiungere questo obiettivo ho scritto il seguente codice. Questo è il mio 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; 
    } 


} 

E questo è tutto ... Ora che cosa ?? Sto andando nella giusta direzione? Se, sono allora come chiamare questo metodo dalla visualizzazione? Alcuni buoni suggerimenti mi aiuteranno davvero. applausi

EDIT:

ho aggiunto il seguente script quando si avvia l'hub

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

     }); 

Questo è il metodo che restituisce i nomi dei clienti nel mio Hub

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

        }).ToList(); 

     Clients.loadUsers(data); 
     return data; 
    } 

in Firebug posso vederlo restituisce qualcosa come segue;

{"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} 

Ma come visualizzarlo a mio avviso ??

EDIT:

questa la visione completa finora

<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: non si vede nulla qui:. $ ('# ClientList') html (data.Result [0] .Nome e cognome); Firebug dice 'i dati non è definito'

risposta

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

volta hub è iniziato chat avrebbero tutte le funzioni pubbliche del vostro hub disponibili come funzioni javascript. Questo è ciò che il signalr/hubs crea usando il miglior metodo di connessione disponibile tra client e server.

Al contrario, l'hub C# avrà accesso a qualsiasi funzione di javascripts impostata, ad es.

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

ps - si potrebbe anche considerare l'utilizzo di OnConnectedAsync, anche se naturalmente si potrebbe ancora persistono questi. Sto anche aspettando il pieno supporto per il supporto web farm usando sql, che è nello pipeline.

+0

Ciao, grazie per la risposta. Ho provato esattamente quello che hai detto. Il mio metodo di controllo restituisce "5" e ho scritto questo codice a mio avviso. $ .connection.hub.start (function() {connectedUserCount = chat.getConnectedUsersCount(); $ ('# clientList'). append ('

  • ' + connectedUserCount + '
  • ');}) ;. . Ma restituisce qualcosa "[oggetto Object]" ... Qualche idea su cosa potrebbe andare storto ?? – kandroid

    +0

    Aggiornerò la risposta per alcuni di questo ora – dove

    +0

    Questo oggetto è la tua lista.Guarda l'aggiornamento per rispondere e forse prova a iniziare con l'invio di un semplice poco o valore al client per i principianti. Ci vuole un po 'per capire come funziona. (ps - la mia risposta originale aveva due difetti e potrebbe ancora, dato che sono pseudo scriverlo, non farlo funzionare) – dove

    Problemi correlati