Есть ли в сигнализаторе способ удалить пользователя из списка, когда тот отключается? - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю небольшое приложение для чата с сигнализатором, и когда пользователи нажимают на Присоединиться к серверу, он добавляет этого пользователя в список ConnectedUsers.

Но как мне удалить конкретного пользователя из списка?и уведомить других клиентов, что пользователь отключен?

ChatHub.cs

static List<User> ConnectedUsers = new List<User>();

public async Task Join(string name) {

            var id = Context.ConnectionId;
            ConnectedUsers.Add(new User {ID = id, Name = name});
            await Clients.Caller.SendAsync("update", "You have connected to the server.");
            await Clients.Others.SendAsync("update", name + " has joined the server.");
            await Clients.All.SendAsync("update-people", JsonConvert.SerializeObject(ConnectedUsers));
        }

public override async Task OnDisconnectedAsync(Exception exception)
        {
            var _user = ConnectedUsers[Convert.ToInt32(Context.ConnectionId)];
            await Clients.All.SendAsync("test", _user);
            //ConnectedUsers.Remove();
            return base.OnDisconnectedAsync(exception);
        }

User.cs

public class User
    {
        public string ID { get; set; }
        public string Name { get; set; }
    }

Я ожидаю, что пользователь будет удален из списка ConnectedUsers и уведомит других клиентов об отключении пользователя, но я не могу использовать await SendAsync в переопределении для OnDisconnectedAsync.

1 Ответ

0 голосов
/ 13 февраля 2019

В функции OnDisconnectedAsync найдите отключенного пользователя в вашем ConnectedUsers (у вас есть ConnectionId, который ранее вы присвоили идентификатору пользователя) и удалите этот объект из списка.После этого boradcast обновил список пользователей.

Пример:

public override Task OnDisconnectedAsync(Exception exception)
    {
        var itemToRemove = ConnectedUsers.Single(r => r.ID == Context.ConnectionId);
        ConnectedUsers.Remove(itemToRemove);

        Clients.Others.SendAsync("update", itemToRemove.Name + " has left the server.");
        Clients.All.SendAsync("update-people", JsonConvert.SerializeObject(ConnectedUsers));
        return base.OnDisconnectedAsync(exception);
    }
...