我的控制器上有一个并发字典列表,用于存储在线用户列表。例如,当客户端A和客户端B连接时,列表中存在2个在线客户端,但是当我断开B然后再次重新连接时,它仍然必须显示2个在线客户端,但在我的情况下,只有客户端B被检测为在线用户(断开然后重新连接)。我正在使用IIS服务器7.5 ..请帮我这个,我需要使用数据库而不是字典吗?我认为如果一个用户断开连接并再次重新连接,它会将字典重置为零.... :(以下是我的集线器类代码
public class Chat : Hub
{
//add online client
private static ConcurrentDictionary<string, string> personLists
= new ConcurrentDictionary<string, string>();
public void Connect(string Username, int ID)
{
string id = Context.ConnectionId;
if (!personLists.ContainsKey(Username))
{
personLists.TryAdd(Username, id);
Clients.Caller.viewOnlinePersons(personLists.Where(p => p.Key != Username));
Clients.Others.enters(Username);
}
else
{
string notif = "user: "+Username+" is already used";
Clients.Caller.onUse(notif);
}
答案 0 :(得分:0)
并发字典应该可以正常工作。如果你可以发布一些代码会很好,但是如果你使用并发字典去这条路线,请确保它是static
(每个信号创建和销毁Hub
类)并且我认为它' d更适合放在集线器本身和私有(当然还有static
)。你也可以使用依赖注入与SignalR,这将更加清洁。
如果您打算在多个服务器上运行应用程序,那么您只需要将数据库作为背板,当然其他服务器无法访问单个服务器的内存,并且会为每个服务器创建重复的字典,因此在这种情况下,您需要占用存储空间并将其在架构中向上移动一点,以供所有服务器访问。