.Net Core SignalR: отправка пользователям, кроме вызывающего абонента, из IHubContext (вводится в контроллер).

чтобы идентифицировать текущего пользователя только при работе с внедренным IHubContext в контроллере, я сохраняю группу с идентификатором пользователя. Однако я изо всех сил пытаюсь отправить всем остальным, так как не могу найти способ узнать, какой идентификатор соединения исключить.

Мой центр

public override Task OnConnectedAsync()
{

    Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name);  
    return base.OnConnectedAsync();
}

В моем методе контроллера я могу вызывать методы для этого пользователя:

await _signalRHub.Clients.Group(User.Identity.Name).InvokeAsync("Send", User.Identity.Name + ": Message for you");

Для IHubContext.Clients.AllExcept требуется список идентификаторов подключения. Как я могу получить идентификатор соединения для идентифицированного пользователя, чтобы уведомлять только других?


person ExternalUse    schedule 06.11.2017    source источник
comment
Почему вы делаете это внутри контроллера? Почему бы не использовать метод на хабе, который клиент может выполнять на сервере? Там у вас есть свой connectionId   -  person Stephu    schedule 06.11.2017
comment
Контроллер уведомляет клиентов о новых объектах встречи - они отображают календарь, и если пользователь добавляет что-то в календарь и пакетный метод завершается успешно, я хотел бы передать изменения, внесенные в dbContext, всем другим пользователям в JSON.   -  person ExternalUse    schedule 06.11.2017
comment
Как долго работает пакетный метод? Обычно я использую сценарий, в котором мастер-модель находится на сервере. Поэтому, если добавление этого элемента на сервер очень короткое, вы также можете отправить вызывающему клиенту. Это вариант только в том случае, если ваше пакетное задание выполняется достаточно быстро. Подумайте, не было ли при добавлении ошибки. В этом случае вам также не нравится, что у вас есть новый элемент календаря на callerclient.   -  person Stephu    schedule 06.11.2017
comment
Позже будет метод OthersInGroup. Но пока не готов   -  person Stephu    schedule 07.11.2017
comment
Пакетный метод уже отправляет изменения обратно вызывающей стороне — это нельзя изменить в компоненте. Он также уведомляет клиента через сигнализатор о том, что что-то идет не так, для этого я отправляю объект в PNotify. Тем не менее, я хотел бы уведомить всех, что есть новые данные - было бы неприятно, если бы они также достались парню, у которого уже есть данные...   -  person ExternalUse    schedule 07.11.2017
comment
Можете ли вы просто устранить дублирование на клиенте? Может проще...   -  person Pawel    schedule 07.11.2017
comment
Мне, вероятно, придется это сделать, да - метод Clients.Others был бы проще. Я проверил проблемы на Github, и они пытаются реализовать что-то вроде этого, хотя еще не для контекста. Пока это возможно только из самого хаба, где id соединения доступен из контекста.   -  person ExternalUse    schedule 07.11.2017


Ответы (1)


Как предложил @Pawel, теперь я устраняю дублирование на клиенте, и это работает (ну, если все ваши клиенты аутентифицированы).

private async Task Identification() => await Clients.Group(Context.User.Identity.Name).InvokeAsync("Identification", Context.User.Identity.Name);
public override async Task OnConnectedAsync()
{    
    await Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name);            
    await base.OnConnectedAsync();
    await Identification();
}

JS для этого (сокращенно):

var connection = new signalR.HubConnection("/theHub");            
var myIdentification;
connection.on("Identification", userId => {
    myIdentification = userId;
});

Теперь вы можете проверить callerIdentification == myIdentification в дополнительных методах, таких как connection.on("something", callerIdentification)

Комментарий @Tester вселяет в меня надежду, что в какой-то момент будет лучший способ отправки через IHubContext.

person ExternalUse    schedule 09.11.2017