【问题标题】:Get names of Online users connected to a Server获取连接到服务器的在线用户的名称
【发布时间】:2012-12-08 15:14:00
【问题描述】:

我是 asp.net 的新手。我已经浏览了这个link,它展示了如何计算使用asp.net 连接到服务器的在线用户。 (当我尝试时它正在工作

我的问题是:我应该在该代码 (Global.asax) 中进行哪些更改,以便它显示连接用户的所有名称,而不是计算它们。

我创建了一个聊天应用程序,它将连接用户的名称存储在js 文件中的变量chatUsername 中,如下所示:

js 文件

   var chatUsername = window.prompt("Enter Username:", "");
   //
   chat.client.addMessage =  //Function
   //
   chat.server.send(chatUsername); 

.aspx.cs 文件

//Using SignalR (I think this doesnt matter)
public class Chat : Hub
{
    public void Send(string from)
    {
        // Call the addMessage method on all clients    
        Clients.All.addMessage(from);
    }
}

你可以找到我的完整代码here

编辑:请提供一个仅与 asp.netsignalr 相关的简单示例(没有其他技术,如 MVC)

请帮忙。

【问题讨论】:

    标签: asp.net signalr global-asax


    【解决方案1】:

    编辑:以下代码指的是SignalR v0.5,不是最新的1.0Alpha2,但我相信道理是一样的

    为此,您需要在服务器和客户端中向 SignalR 连接过程中添加几个步骤:

    在服务器端:

    1. 例如,在应用程序启动时,您可以实例化一个静态内存存储库(可以是 的字典),该存储库将用作存储所有当前连接的用户的用户存储库。
    2. 在集线器中,您需要处理 Disconnect 事件(当用户断开连接时,也需要从用户存储库中删除)并通知所有其他客户端该用户已断开连接
    3. 在集线器中,您需要添加两个新方法(名称可以是任何您想要的名称),这将帮助客户端连接到系统并获取当前连接的用户列表:
      1. GetConnectedUsers() 只返回已连接用户的集合
      2. Joined() 集线器将创建一个新用户,使用存储在往返状态中的信息(客户端选择的用户名)和 SignalR 连接 ID,并将新创建的用户添加到内存中存储库。

    在客户端: 首先,您需要实例化与您的服务器端集线器相关的 javascript 对象

    var chat = $.connection.chat;
    chat.username = chatUsername;
    

    然后实现集线器会调用的所有函数,最后连接集线器:

        // Step 1: Start the connection
        // Step 2: Get all currenlty connected users
        // Step 3: Join to the chat and notify all the clients (me included) that there is a new user connected
        $.connection.hub.start()
                    .done(function () {
                        chat.getConnectedUsers()
                                    .done(/*display your contacts*/);
                                        });
                                    }).done(function () {
                                        chat.joined();
                                    });
                    });
    });
    

    如果你问我们为什么需要添加一个像“chat.joined()”这样的阶段是因为在Hub上处理连接事件的方法中,还没有往返状态,所以Hub无法检索用户选择的用户名。

    无论如何,我写了一篇博文来更详细地展示如何使用 Asp.Net MVC 创建一个基本的 SignalR 聊天 Web 应用程序,它可以在以下位置获得: http://thewayofcode.wordpress.com/2012/07/24/chatr-just-another-chat-application-using-signalr/

    在帖子中,您还将找到一个指向发布源代码的 github 存储库的链接。 我希望这会有所帮助。

    瓦莱里奥

    【讨论】:

    • 我是 asp.net 的新手。你能解释清楚吗。我已经浏览了你提供的链接。但是该链接遵循 MVC 概念,这不允许我作为实习生使用..
    • 你好,我也在我的博客上回复了。您需要了解的是,在您的 javascript 代码中,您需要创建一个与服务器端 Hub 链接的对象(通过 $.connection.chat 代码行),然后您需要为该对象分配往返状态(例如,用户的用户名),实现集线器能够从服务器调用的所有回调,最后通过上面显示的代码块($.connection.hub.start())连接到服务器。完毕(....)...);在服务器上,您的 Hub 将实现 getConnectedUsers 和 Joined(),仅此而已!
    • 哎呀,我不知道你们俩是一样的:).. 无论如何我不能使用该链接,因为它基于 MVC,我不允许使用该链接。我会关注上面的评论并尝试解决它。​​谢谢你的回复。
    • 正如我所说,您不需要该链接中的 MVC 内容。您基本上需要查看集线器中实现的 getConnectedUsers 和 Joined 方法以及代码的 javascript 部分。剩下的就看你了:)
    • 如果您对此有更具体的问题,请告诉我。
    【解决方案2】:

    显然,您正在使用Signal-R - 因此请尝试在 java 脚本本身中跟踪在线用户(即连接的客户端)的状态。使用Connected/Disconnected/Reconnected 服务器端事件向所有客户端广播——来自documentation

    public class Chat : Hub
    {
        public override Task OnConnected()
        {
            return Clients.All.joined(Context.ConnectionId, DateTime.Now.ToString());
        }
    
        public override Task OnDisconnected()
        {
            return Clients.All.leave(Context.ConnectionId, DateTime.Now.ToString());
        }
    
        public override Task OnReconnected()
        {
            return Clients.All.rejoined(Context.ConnectionId, DateTime.Now.ToString());
        }
    }
    

    全局服务器端存储(例如 - 静态字典)可用于根据连接 ID 存储状态 - 这样,此字典可以为您提供所需连接 ID 的用户。例如,

    // dis-claimer: untested code - just to give the idea/hint/outline
    public class Chat : Hub
    {
        // change to use Concurrent Dictionary (or do thread-safe access)
        static Dictionary<string, User> _users = new Dictionary<string, User>()
    
        // call from client when it goes online
        public void Join(string name)
        {
           var connId = this.Context.ConnectionId;
           __users.Add(connId, new User(connId, name));
        }
    
        public override Task OnConnected()
        {
            return Clients.All.joined(_users[Context.ConnectionId], DateTime.Now.ToString());
        }
    
        public override Task OnDisconnected()
        {
            var user = _users[Context.ConnectionId];
            _users.Remove(Context.ConnectionId);
            return Clients.All.leave(user, DateTime.Now.ToString());
        }
    
        public List<User> GetUsers()
        {
           return _users.Values.ToList()
        }
    
    }
    

    【讨论】:

    • +1 嘿,我明白你想说什么。这会将值存储在服务器端。那么如何在客户端页面中显示它们?
    • VS 向User 显示红色涂鸦错误 --> The type or namespace name 'User' could not be found
    • @Mr_Green,用户将是一个自定义类 - 根据您的需要创建!
    • @Mr_Green,在不同的注释上,请参阅这个使用 Signal-R - IMO 的示例聊天应用程序,它可能会在很多方面有所帮助:thewayofcode.wordpress.com/2012/07/24/…
    • 您能否举一些示例示例 User 应该是怎样的.. 我已经浏览了链接.. 但是因为我是新手,所以无法理解。
    【解决方案3】:

    我认为这应该适合你:-

       void Application_Start(object sender, EventArgs e)
         {
            // Code that runs on application startup
            Application["OnlineUsers"] = 0;
            List<string> list = new List<string>();
         }
          //First check if it is Authenticated request:-
          void Session_Start(object sender, EventArgs e)
         {
          if(Request.IsAuthenticated)
          list.Add(User.Identity.Name);
           //your rest of code .......
         }
    

    list 将返回所有在线的用户名:-

    【讨论】:

    • 对页面没有影响..您的代码中似乎有两个问题.. 1) list 已填充但未在任何地方显示。 2)js filechatUsername 变量,用于存储用户名,在您的代码中未提及。 (我可能错了..)
    • 1) 我刚刚向您展示了如何继续而不是完整的代码 2) 我不知道您如何将 JS 变量传递给服务器。3) 您计划如何显示用户名 (作为表结构,逗号分隔的字符串或任何其他shceme)???
    猜你喜欢
    • 2012-11-24
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多