【问题标题】:How to get a list of connected clients on SignalR如何在 SignalR 上获取已连接客户端的列表
【发布时间】:2012-09-30 09:51:44
【问题描述】:

我对 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();

        });

这是在我的 Hub 中返回客户端名称的方法

  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>

问题:在这里看不到任何东西:$('#clientList').html(data.Result[0].FullName); firebug 说“数据未定义”

【问题讨论】:

    标签: javascript c# .net asp.net-mvc signalr


    【解决方案1】:

    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# 集线器将可以访问您设置的任何 javascripts 函数,例如

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

    ps - 你也可以考虑使用OnConnectedAsync,当然你可能仍然坚持这些。我也在等待对使用 sql 的网络场支持的全面支持,这在 pipeline 中。

    【讨论】:

    • 您好,感谢您的回复。我已经完全按照您所说的进行了尝试。我的 Controller 方法返回“5”,并且我将此代码写入了我的视图。 $.connection.hub.start(function () {connectedUserCount = chat.getConnectedUsersCount();$('#clientList').append('
    • ' + connectedUserCount + '
    • ');});。 .但它返回一些“[object Object]”......知道可能出了什么问题吗??
  • 该对象是您的列表。请参阅更新以回答,也许只是尝试先将一个简单的 poco 或值发送回客户端以供初学者使用。掌握它的工作方式确实需要一点时间。 (ps - 我原来的答案有两个缺陷,可能还没有,因为我是伪写这个,而不是运行它)
  • 希望开始有意义,早上再看。
  • 嗨..感谢您的帮助..我会尽快尝试并回复您发生的情况..
  • hi.edited 这个问题,添加了一些我最近写的额外代码。但还是打不通。 :(
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签