2015-04-30 5 views
0

У меня есть проект веб-API, в котором есть концентратор SignalR для отправки сообщений конкретным клиентам (в отдельном приложении MVC). Отправка всем клиентам работает нормально, но отправка на конкретный вызов была сложной задачей. Как я могу изменить свой код, чтобы это сделать? Ниже мой текущий настрой.Широковещательное сообщение от сервера к конкретному клиенту за пределами концентратора

Класс концентратор (чтение в другом месте, что можно связать каждый пользователь к одной группе)

[HubName("GWEventHub")] 
public class GatewayEventHub : Hub 
{   
    public override Task OnConnected() 
    { 
     this.Groups.Add(this.Context.ConnectionId, this.Context.Request.User.Identity.Name); 
     return base.OnConnected(); 
    } 

    // No other methods needed as client does not need to message the server 

} 

код в контроллере API, который посылает сообщение клиента

private void SendClientMessage(string message) 
{ 
    var context = GlobalHost.ConnectionManager.GetHubContext<GatewayEventHub>(); 
    context.Clients.All.sendClientMessage(message); 
} 

код клиента

$(function() { 

    $.connection.hub.url = "http://localhost:53453/signalr"; 
    var hub = $.connection.GWEventHub; 

    hub.client.sendClientMessage = function(message) { 
     console.log("message recieved from GW service " + message); 
    } 

    $.connection.hub.start().done(function() { 
     console.log('connect to GatewayEventHub, Connection ID = ' + $.connection.hub.id); 
    }) 
    .fail(function (e) { 
     console.error('Failed to connect to signalr hub at ' + hub.url + 'Connection Error: ' + e); 
    }); 

}); 
+0

Вы пробовали 'context.Clients.Client (connectionId)' или 'context.Clients.User (userId)'? – Pawel

+0

@Pawel, как бы мой контроллер api имел доступ к идентификатору соединения, чтобы передать его, когда он вызывается извне концентратора? –

+0

Это то, что вам нужно знать, Stavros_S. Об этом нет. Просто сохраните свой 'connectionId/userId' где-то ваш api имеет доступ к нему. – Buildstarted

ответ

1

Я бы создал класс ChatRoom (если это ваш чат, который вы делаете), который содержит все co nnected userid или connectionids в зависимости от того, хотите ли вы, чтобы комната чата была глобальной для каждого подключенного пользователя (UserId), или если вы хотите, чтобы ChatRoom был уникальным для каждой вкладки браузера (идентификатор соединения).

При подключении к чату добавьте пользователя/conn.id в экземпляр чата. Вы можете убедиться, что пользователи удалены, если вы переопределите OnDisconnect в концентраторе и удалите пользователя из всех чатов, если он активен.

+0

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

Смежные вопросы