SignalR Core отслеживает подключенных пользователей - PullRequest
0 голосов
/ 04 августа 2020

У меня есть ASP. NET Core 3.1 SignalR Hub.

Я хотел бы отслеживать подключенных пользователей в многопоточной среде.

Согласно Microsoft, Концентраторы временны, поэтому не следует сохранять на них какое-либо состояние.

Ниже мой класс концентратора:

public class MyHub : Hub
{
    private static bool _isLocked;
    private static readonly object _syncRoot = new object();

    // I want to remove this state property
    private static readonly List<OnlineUser> _users = new List<OnlineUser>();

    public override async Task OnConnectedAsync()
    {
        if (!_isLocked)
        {
            lock (_syncRoot)
            {
                if (!_isLocked)
                {
                    _isLocked = true;

                    _users.Add(new Online User
                    {
                        ConnectionID = Context.ConnectionId,
                        UserName = ""
                    });

                    _isLocked = false;
                }
            }
        }
    }
}

Я также пробовал приведенный ниже класс stati c, который будет упоминается в хабе:

public static class OnlineUsers
{
    private static List<OnlineUser> Users = new List<OnlineUser>();
}

public class MyHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        // code omitted for brevity
        OnlineUsers.Users.Add(new OnlineUser
        {
            ConnectionID = Context.ConnectionId,
            UserName = ""
        });
    }
}

Я также нашел примеры, в которых можно использовать параллельный словарь, но это снова будет хранить состояние в хабе: private static readonly ConcurrentDictionary<string, OnlineUser> _users;

Что такое рекомендуемый способ сделать это, поскольку я не вижу никаких рекомендаций в собственной документации Microsoft, кроме того, что вам нужно отслеживать это самостоятельно.

Ответы [ 2 ]

0 голосов
/ 14 августа 2020

Я решил эту проблему, используя параллельный словарь stati c в отдельном классе stati c, на который ссылается Hub.

0 голосов
/ 07 августа 2020

Посмотрите на свойство HubConnectionContext.Items в библиотеке do tnet

// Gets a key/value collection that can be used to share data within the scope of this connection.

public virtual System.Collections.Generic.IDictionary<object,object> Items { get; }

Я также читал, что вы можете использовать базу данных или даже базу данных в памяти.

Способ, которым я Я собираюсь сделать это, используя DI для регистрации службы Singleton, которая может работать в течение всего жизненного цикла моего приложения. Таким образом, я могу масштабировать его, чтобы удерживать любое нужное мне состояние. Я думаю, что это дало бы вам необходимую гибкость без нарушения передовых практик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...