2017-02-03 9 views
1

Это одностраничное приложение с угловыми js и web api. Я реализовал signalr на странице, которая вызывает метод server.CheckIfRunning(), который проверяет, выполняется ли фоновый процесс и отсылает сообщение клиенту. Когда я впервые заходил на эту страницу, я получаю уведомление успешно. Но когда я перехожу на другую страницу и снова возвращаюсь, страница вызывает сервер.CheckIfProcessRunning() правильно, сервер также нажимает на клиента. Но клиент не получает уведомление.Signalr 2 push не удается использовать одностраничное приложение

Client код сторона:

var hub = $.connection.tRAHub; 
    hub.client.NotifyAlreadyRunning = function (message) { 
      $scope.$apply(function() { 
       $scope.status=message; 
      }); 
     }; 

    $.connection.hub.start() 
     .done(function() { 
      hub.server.checkIfRunning($.connection.hub.id); 
    }); 

сервера код сторона:

public class TRAHub : Hub 
{ 
    public void CheckIfRunning(string id) 
    { 
     var isRunning = CheckIfProcessRunning();//this method checks if the process is running. code not shown 

     if (isRunning) 
     { 
      var client = Clients.Client(id); 
      client.NotifyAlreadyRunning(id); 
     } 
    } 
} 

FYI, на стороне клиента код выполняется всякий раз, когда я иду на эту страницу. Может кто-нибудь, пожалуйста, дайте мне знать, что я сделал неправильно?

+0

Вы можете переопределить OnConnecred и OnDisconnected события на сервере и клиенте, чтобы увидеть, что клиент не будет отключен неправильно? Кстати, вы можете включить 'EnableDetailedErrors', чтобы увидеть, есть ли исключения на стороне клиента. – cassandrad

+0

Спасибо, cassandrad. Я попытался подключиться и отключил метосы на сервере, и они, похоже, работают нормально. Он подключается. Когда я перехожу к другому виду, он не отключается. Но подключается снова, когда я возвращаюсь к этому представлению. Это вызывает проблемы? Должен ли я отключить ehile, оставляя представление? Я попытаюсь внедрить события на стороне клиента и включит enableetailerrors, чтобы увидеть, могу ли я что-то найти. –

ответ

0

Наконец-то я выяснил решение, которое пытается случайным образом выбирать разные варианты. При изменении значения url, переходя на другую страницу, я вызвал метод $ .connection.hub.stop(), который решил проблему.

Поскольку он вызывает start() при загрузке этой html-страницы, она не была остановлена ​​при переходе на другой URL-адрес. И он снова подключается, когда я вернусь на эту страницу. Возможно, это была проблема, хотя не было зарегистрировано, что вызов метода start() несколько раз бесполезен, хотя идентификатор соединения остается таким же. Вызов метода остановки при переходе на другой URL-адрес сделал трюк!

Большое вам спасибо за помощь и помощь.

1

Вы можете попробовать использовать

Clients.Caller.NotifyAlreadyRunning(id); 

Подробнее и другие варианты here.

+0

DDan, Это не помогло. Я думаю, что проблема связана с событиями на угловом контроллере, где я подписываюсь на SignalR. В первый раз он работает правильно. Когда я перехожу к другому URL-адресу, а затем возвращаюсь на страницу, он снова подписывается и вызывает метод CheckIfRunning(). Затем сервер также вызывает NotifyAlreadyRunning() правильно. Но клиент этого не признает. Но, если я обновляю страницу (F5), она снова работает. Я думаю, что когда я покидаю страницу и возвращаюсь снова, она нуждается в обновлении, которое сбрасывает подписку. –

+0

Является ли ваш идентификатор соединения одинаковым? Я подозреваю, что это не так. – DDan

+0

Да.Идентификатор соединения тот же. Поскольку это одностраничное приложение, оно не обновляется. И идентификатор соединения остается таким же. Когда я нажимаю F5, он соединяется с новым идентификатором. –

0

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

Существует также возможное решение, которое существующий angularjs signalR модуль: https://github.com/JustMaier/angular-signalr-hub

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

  • Нет связанных вопросов^_^