Как отправить сообщение конкретному клиенту с помощью 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(); } } }