2014-11-14 3 views
0

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

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

на целевой странице контроллер файл я расслоение плотной написал код для добавления пользователя в группе, как следовать ...

$rootScope.signalRHub = $.connection.signalRHub; 

$rootScope.hubStart = null; 

$rootScope.startHub = function() { 

    if ($rootScope.hubStart == null) 
    { 
     $rootScope.hubStart = $.connection.hub.start(); 
    } 
    return $rootScope.hubStart; 
} 

$scope.$on('$locationChangeStart', function (event) { 

     if ($rootScope.userName != "") { 
      $rootScope.signalRHub.server.leaveGroup($rootScope.userName); 
     } 
}); 

// Start the connection 
$rootScope.startHub().done(function() { 

     $rootScope.signalRHub.server.joinGroup($rootScope.userName); 
}); 

на работе Run контроллер файл я расслоение плотной написал следующий код ....

$rootScope.signalRHub.client.showNotification = function (message) { 
    notify('Your notification message');//notify is the angular js directive injected in this controller which runs fine 
}; 

$scope.$on('$locationChangeStart', function (event) { 
     $rootScope.signalRHub.server.leaveGroup($rootScope.studyid); 
}); 

// Start the connection  
$rootScope.startHub().done(function() { 

    $rootScope.signalRHub.server.joinGroup($rootScope.userName 
}); 

узловом Файл .....

[EnableCors(origins: "*", headers: "*", methods: "*")] 
    public class SignalRHub : Hub 
    {   
     public Task JoinGroup(string groupName) 
     { 
      return Groups.Add(Context.ConnectionId, groupName); 
     }  

     public Task LeaveGroup(string groupName) 
     { 
      return Groups.Remove(Context.ConnectionId, groupName); 
     } 

     public void ShowNotification(string jobRunDetailId, string userName) 
     { 
      if (!string.IsNullOrEmpty(userName)) 
      { 
       var context = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>(); 

       context.Clients.Group(userName).showNotification(jobRunDetailId); 
      } 
     } 
    } 

вопрос в том, когда я запустить приложение в группу dd для обеих страниц работает отлично. Но когда я вызываю «showNotification» из Hub, он не показывает никакого сообщения.

Но странно, если я прокомментирую функцию «$ rootScope.startHub(). Done ....» на целевой странице, тогда функция уведомления об уведомлениях на странице jobrun работает нормально. Я не уверен, что пишу «$ rootScope.startHub() .done() ... "на двух местах создает эту проблему. help.

+0

Прежде всего вам нужно убедиться, что '$ rootScope.signalRHub.client.showNotification' определен * перед *, вы начинаете свое соединение. Если этого не происходит, это объясняет, почему вызов showNotification не вызывается. – halter73

+0

@ halter73: - Большое спасибо ... я изменил код и переместил объявление всех функций на первой странице перед началом соединения, и он начал работать ... если вы написали это в разделах ответов, я бы принял это ... : P –

ответ

2

Перед началом вызова вам необходимо подключить все обратные вызовы. Если вы включите ведение журнала на стороне клиента, он скажет вам, к каким узлам вы подписаны.

Помимо этого: [EnableCors] - специфический атрибут webapi, который не работает в SignalR.

+0

Привет, Дэвид, спасибо за вашу помощь. Вопрос решен как «halter73». Я знаю, что вы ребята, которые создали signalr, его действительно awesom ... –

+0

Вы должны принять этот ответ. Его ответ такой же, как и мой, плюс он предоставил другие полезные советы. @dfowler нуждается в дополнительных очках: P – halter73

+0

вы правы ... сделали :) –

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