2012-09-30 64 views
8

我对SignalR很陌生。 我的第一项任务是制作简单的聊天应用程序。如何获取SignalR上已连接客户端的列表

我一直在浏览和阅读,最后做了一个页面,你来聊天,它工作正常。

现在我需要显示连接的客户端列表。为了实现这一点,我编写了下面的代码。 这是我的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; 
    } 


} 

而那就是它......现在呢? 我该走向正确的方向吗?如果,那我怎么从视图中调用这个方法呢? 一些很好的建议将真正帮助我。 欢呼

编辑:

我已经添加下面的脚本当轮毂启动

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

     }); 

这是在我的集线器返回客户端名称的方法

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

        }).ToList(); 

     Clients.loadUsers(data); 
     return data; 
    } 

在萤火虫我可以看到它返回的东西如下;

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

但是,我怎么会显示,在我看来??

编辑:

这个完整的视图,到目前为止

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

问题:什么也没看到这里:$( '#客户端列表')HTML(data.Result [0] 。全名); 萤火说,“数据没有定义”

回答

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

一旦枢纽开始聊天会对你的集线器可作为JavaScript函数所有的公共职能。这是信号/集线器使用客户端和服务器之间最好的可用连接方法创建的。

反过来,您的C#中心可以访问您设置的任何JavaScript函数,例如,

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

PS - 你也可以考虑用OnConnectedAsync,不过当然你仍然可能会持续这些。我还在等待使用sql的网络服务器场支持的完全支持,这在pipeline中。

+0

嗨,谢谢你的回复。我已经尝试了你说的话。我的控制器方法返回'5',并且我将这段代码写入了我的视图。 $ .connection.hub.start(function(){connectedUserCount = chat.getConnectedUsersCount(); $('#clientList')。append('

  • '+ connectedUserCount +'
  • ');});. 。但它返回一些“[object Object]”...任何想法可能出错? – kandroid

    +0

    我会更新一些现在的答案 – dove

    +0

    该对象是您的列表。请参阅更新以回答问题,也许只是尝试开始将简单的poco或价值返回给客户端以供初学者使用。获得这种工作方式的麻烦确实需要一点点。 (ps - 我原来的答案有两个缺陷,可能还有,因为我伪造了这个,没有运行) – dove

    相关问题