Asp.net 检索连接到服务器的联机用户的名称

Asp.net 检索连接到服务器的联机用户的名称,asp.net,signalr,Asp.net,Signalr,我之前问过这个问题,得到了很好的回应。但由于我是asp.net(和jquery)新手,我无法理解程序是如何运行的 总结: 我已经创建了一个基本的聊天应用程序。现在我正在尝试添加一个高级功能,例如每当用户联机(连接到服务器)时,服务器都应该向连接到该服务器的所有用户显示或广播可用的联机用户的用户名 通过参考对上一个问题(和)的回答,我修改了我的class文件和jquery文件,它们给出了错误,如下链接所示。(我想我很接近) (两个错误,我在代码注释之间提到了错误) (工作正常,需要时请参考) 请看

我之前问过这个问题,得到了很好的回应。但由于我是asp.net(和jquery)新手,我无法理解程序是如何运行的

总结:

我已经创建了一个基本的聊天应用程序。现在我正在尝试添加一个高级功能,例如每当用户联机(连接到服务器)时,服务器都应该向连接到该服务器的所有用户显示或广播可用的联机用户的用户名

通过参考对上一个问题(和)的回答,我修改了我的
class
文件和
jquery
文件,它们给出了错误,如下链接所示。(我想我很接近)

(两个错误,我在代码注释之间提到了错误)
(工作正常,需要时请参考)

请看一下以上文件,并协助我


PS:在上一篇文章中,我想如果我更改Global.asax代码,我的问题就会得到解决。。我后来意识到这是错误的。

您的第一个错误来自:

Clients.joins(Context.ConnectionId, Caller.username, DateTime.Now);
应该是:

Clients.All.joins(Context.ConnectionId, Clients.Caller.username, DateTime.Now);
与之相关的其他错误:在JS文件中,应该是: 第15行

第二个错误: 错误与它所说的完全一样,您的dictionary对象没有toList函数。其次,您不能简单地将列表或字符串直接转换为聊天对象

根据你的设置,你目前没有一个合适的“用户”列表可以返回。现在,您正在保存一个列表以表示单个用户。您可能希望尝试将dictionary对象更改为

static ConcurrentDictionary<string, User> _users = new ConcurrentDictionary<string, User>();
然后在连接函数上,您可以执行以下操作:

public void Joined()
{
    User user = new User 
    { 
        Name = Clients.Caller.username,
        ConnectionID = Context.ConnectionId
    };

    _users.TryAdd(user.ConnectionID, user);
    Clients.All.joins(user.ConnectionID, user.Name, DateTime.Now);
}
最后,您的GetConnectedUsers将结束(确保您正在“使用System.Linq;”):

公共列表GetConnectedUsers()
{
返回_users.Values.ToList();
}
我可能有点过火了,但希望这有帮助

如果您需要参考从SignalR 0.5.3到1.0 alpha的更改日志,这里有一篇关于所有修改的文章:

我也会这么做,我只想说字典应该是静态的(或在更高的上下文中进行良好管理),否则你会得到很多只有一个用户的字典实例。我可能也应该使用ConcurrentDictionary,很快就把这篇文章放在一起。现在你在炫耀:D,开玩笑,是的,这是一款既先进又优雅的产品;)在
User
类中,有一个构造函数接受两个参数。因此不会生成默认构造函数。您正在尝试使用默认构造函数,但该构造函数不存在。
public class User
{
    public string Name { get; set; }
    public string ConnectionID { get; set; }
}
public void Joined()
{
    User user = new User 
    { 
        Name = Clients.Caller.username,
        ConnectionID = Context.ConnectionId
    };

    _users.TryAdd(user.ConnectionID, user);
    Clients.All.joins(user.ConnectionID, user.Name, DateTime.Now);
}
public List<User> GetConnectedUsers()
{
    return _users.Values.ToList();
}