ishwar18 Ответов: 1

Как отправить сообщение конкретному клиенту с помощью signalr


Я хочу вызвать метод SendChatMessage(string who,string message) со стороны клиента, но со стороны клиента я должен передать параметры. От того, где я хотел бы получить имена подключенных клиентов. В этом случае я не понимаю, что передать в качестве параметра вместо "кто".

Что я уже пробовал:

/ *Следующие примеры показывают, как я сохраняю информацию о соединении и пользователе в словаре, который хранится в памяти. Словарь использует хэш-набор для хранения идентификатора соединения.*/
using System.Collections.Generic;
using System.Linq;

namespace BasicChat
{
    public class ConnectionMapping<t>
    {
        private readonly Dictionary<T, HashSet<string>> _connections =
            new Dictionary<T, HashSet<string>>();

        public int Count
        {
            get
            {
                return _connections.Count;
            }
        }

        public void Add(T key, string connectionId)
        {
            lock (_connections)
            {
                HashSet<string> connections;
                if (!_connections.TryGetValue(key, out connections))
                {
                    connections = new HashSet<string>();
                    _connections.Add(key, connections);
                }

                lock (connections)
                {
                    connections.Add(connectionId);
                }
            }
        }

        public IEnumerable<string> GetConnections(T key)
        {
            HashSet<string> connections;
            if (_connections.TryGetValue(key, out connections))
            {
                return connections;
            }

            return Enumerable.Empty<string>();
        }

        public void Remove(T key, string connectionId)
        {
            lock (_connections)
            {
                HashSet<string> connections;
                if (!_connections.TryGetValue(key, out connections))
                {
                    return;
                }

                lock (connections)
                {
                    connections.Remove(connectionId);

                    if (connections.Count == 0)
                    {
                        _connections.Remove(key);
                    }
                }
            }
        }
    }
}

В следующем примере показан класс сопоставления соединений из концентратора. Экземпляр класса хранится в переменной с именем _connections.
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace BasicChat
{
    [Authorize]
    public class ChatHub : Hub
    {
        private readonly static ConnectionMapping<string> _connections = 
            new ConnectionMapping<string>();

        public void SendChatMessage(string who, string message)
        {
            string name = Context.User.Identity.Name;

            foreach (var connectionId in _connections.GetConnections(who))
            {
                Clients.Client(connectionId).addChatMessage(name + ": " + message);
            }
        }

        public override Task OnConnected()
        {
            string name = Context.User.Identity.Name;

            _connections.Add(name, Context.ConnectionId);

            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            string name = Context.User.Identity.Name;

            _connections.Remove(name, Context.ConnectionId);

            return base.OnDisconnected(stopCalled);
        }

        public override Task OnReconnected()
        {
            string name = Context.User.Identity.Name;

            if (!_connections.GetConnections(name).Contains(Context.ConnectionId))
            {
                _connections.Add(name, Context.ConnectionId);
            }

            return base.OnReconnected();
        }
    }
}

1 Ответов

Рейтинг:
1

Graeme_Grant

Это официальная документация, которая покрывает ваши требования: Сопоставление пользователей SignalR с подключениями | Microsoft Docs[^]

Существует целый ряд решений, найденных с помощью поиска Google: сервер signalr для конкретного клиента[^]

Вот один: asp.net -SignalR-отправка сообщения конкретному пользователю с помощью (IUserIdProvider) *NEW 2.0.0* - переполнение стека[^]