2015-03-12 1 views
3

У меня внутри моего концентратора метод, который используется для отправки конкретным клиентам, что билет был обновлен. Однако я хочу, чтобы отправить его на сервер внутри контроллера и для конкретных пользователей, вы можете увидеть, как я делаю это ниже:Signalr не отправляет определенным пользователям

Я использую следующий метод для отправки конкретных клиентов:

public void NotifyUpdatedTicket(Ticket ticket, string note, params string[] aliases) 
{ 
    foreach (string a in aliases) 
    { 
     foreach (string connectionId in _allConnections.GetConnections(a)) 
     { 
      Clients.Client(connectionId).notifyUpdatedTicket(ticket, note); 
     } 
    } 
} 

в _allConnections такой же, как класс в http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

Однако вместо передачи 1 пользователя Я передал список псевдонимов, а затем получить их соединения и отправить их соединение идентификаторов.

Однако он, кажется, не отправляет правильно, он отправляет его всем клиентам. Вот команда, я использую для вызова метода в мой контроллер:

GlobalHost.ConnectionManager.GetHubContext<TicketHub>().Clients.All.notifyUpdatedTicket(viewModel.Current, viewModel.NewNote, viewModel.Current.OpenedBy, viewModel.Current.AssignedTo); 

Когда я посылаю выше команду с конкретным OpenedBy и AssignedTo, он посылает это все пользователи, когда он не должен.

Я пропустил что-то, вызвав его в контроллере, который отправляет его только определенным пользователям или чему-то еще?

Даже когда я вставляю псевдоним лиц непосредственно в метод хаба, он по-прежнему отправляется всем. Я предполагаю, что это связано с методом контроллера.

+0

Никто не знает об этом? – Insight

ответ

1

Этот

Clients.All.notifyUpdatedTicket 

посылает сообщение всем клиентам. Это не будет вызывать метод с этой подписью (я предполагаю, что это то, что вы пытаетесь сделать):

public void NotifyUpdatedTicket(Ticket ticket, string note, params string[] aliases) 

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

В любом случае, если вы это сделаете, вы должны использовать GetHubContext<TicketHub>() из этого метода, даже если он является частью класса концентратора, потому что контекст концентратора настроен как часть конвейера-концентратора, когда поступает запрос на этот концентратор. Без этого концентратор является обычным классом, и у вас нет доступа к динамическим членам, например, Clients.

Итак, в целом, похоже, вы смущены некоторыми фундаментальными принципами. Я предлагаю переместить NotifyUpdatedTicket в отдельный класс, который также кэширует соответствующий контекст хаба, а затем вызывает этот метод при необходимости (например, с помощью метода контроллера MVC, если это ваше намерение).

+0

В учебнике http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory Он показывает, что он отправляет его клиентам из метода C# , Не уверен, что я понимаю, что вы говорите. – Insight

+0

отправляет клиентам метод хаба, да (SendChatMessage), но вы звоните из другого места с помощью GetHubContext (я не знаю, где этот код); в своем примере клиент вызывает SendChatMessage, и этот метод затем распространяется на других клиентов; в вашем примере вы пытаетесь начать с сервера (я думаю, не совсем ясно, где GetHubContext () .Clients.All ... call is); я говорю, что строка, начинающаяся с GlobalHost .., будет напрямую вызывать всех клиентов, а не ваш вспомогательный метод, который выполняет итерации над псевдонимами. –

+0

Это пинговало в моей голове, что вы имели в виду. Кажется, сейчас работает. Благодаря тонну! – Insight