У меня есть проект веб-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);
});
});
Вы пробовали 'context.Clients.Client (connectionId)' или 'context.Clients.User (userId)'? – Pawel
@Pawel, как бы мой контроллер api имел доступ к идентификатору соединения, чтобы передать его, когда он вызывается извне концентратора? –
Это то, что вам нужно знать, Stavros_S. Об этом нет. Просто сохраните свой 'connectionId/userId' где-то ваш api имеет доступ к нему. – Buildstarted