2017-02-03 1 views
1

이것은 각도 j와 웹 API가있는 단일 페이지 응용 프로그램입니다. 백그라운드 프로세스가 실행 중인지 확인하고 클라이언트에 메시지를 푸시하는 메서드 server.CheckIfRunning()을 호출하는 페이지에서 signalr을 구현했습니다. 처음으로 해당 페이지로 이동하면 알림이 성공적으로 수신됩니다. 그러나 다른 페이지로 이동하여 다시 돌아 오면 페이지에서 server.CheckIfProcessRunning()을 올바르게 호출하고 서버가 클라이언트로 푸시됩니다. 그러나 클라이언트는 알림을받지 못합니다.Signalr 2 푸시가 단일 페이지 응용 프로그램에 실패 함

클라이언트 측 코드 :

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); 
     } 
    } 
} 

참고로, 클라이언트 측 코드가 실행됩니다. 누구든지 내가 잘못 한 것을 알려 주실 수 있습니까?

+0

당신이 OnConnecred을 무시하고 해당 클라이언트가 잘못 연결되어 있습니다보고 서버와 클라이언트 측에 이벤트를 OnDisconnected 수 은? 그런데, EnableDetailedErrors를 사용하여 클라이언트 측에 예외가 있는지 확인할 수 있습니다. – cassandrad

+0

감사합니다. 내가 onconnected 시도하고 서버에 연결되어 있지 않은 methos에 그들은 잘 작동하는 것. 연결됩니다. 다른보기로 이동하면 화면이 깨지지 않습니다. 그러나 내가이 견해로 돌아올 때 다시 연결됩니다. 이것은 문제를 일으키는가? 내가보기를 떠나서 연결을 해제해야합니까? 나는 클라이언트 측에서의 이벤트를 내포하려고 노력할 것이고, 내가 뭔가를 찾을 수 있는지를 enabledetailederrors가 볼 수있게 할 것이다. –

답변

0

마지막으로 나는 다른 옵션을 무작위로 시도하는 해결책을 찾아 냈습니다. URL 변경 이벤트에서 다른 페이지로 이동하는 동안 문제를 해결하는 $ .connection.hub.stop() 메서드를 호출했습니다.

이 HTML 페이지를로드하는 동안 start()를 호출하기 때문에 다른 URL로 이동하는 동안 중지되지 않았습니다. 그리고이 페이지로 돌아올 때 다시 연결됩니다. 연결 ID가 같더라도 start() 메서드를 여러 번 호출하면 문제가 발생한다는 문서는 없지만 문제가 될 수 있습니다. 다른 URL로 이동하는 동안 중지 메서드를 호출하는 것은 트릭을 마쳤습니다!

여러분의 도움에 감사드립니다.

1

당신은

Clients.Caller.NotifyAlreadyRunning(id); 

세부 사항 및 기타 옵션 here를 참조 사용을 시도 할 수 있습니다.

+0

DDan, 도움이되지 않았습니다. 나는 문제가 내가 SignalR에 가입하고있는 각도 컨트롤러의 이벤트라고 생각한다. 처음 제대로 작동합니다. 다른 URL로 이동 한 다음 페이지로 돌아 오면 다시 구독하고 CheckIfRunning() 메서드를 호출합니다. 그런 다음 서버는 또한 NotifyAlreadyRunning()을 올바르게 호출합니다. 그러나 클라이언트는 그것을 인식하지 못합니다. 그러나 페이지 (F5)를 새로 고치면 다시 작동합니다. 페이지를 닫고 다시 돌아 왔을 때 구독을 재설정하는 새로 고침이 필요하다고 생각합니다. –

+0

연결 ID가 여전히 동일합니까? 나는 그렇지 않다고 생각한다. – DDan

+0

예.연결 ID는 동일합니다. 단일 페이지 응용 프로그램이므로 새로 고쳐지지 않습니다. 그리고 연결 ID는 동일하게 유지됩니다. F5를 누르면 새로운 ID로 연결됩니다. –

0

서비스에서 신호 장치를 추상화하는 것이 좋습니다. 그 결과, 시작시 한 번 처리하고 서버에서 활성 컨트롤러로 이벤트를 전달할 수 있습니다. 관찰자 패턴과 같은 것을 구현할 수 있습니다. 해체시 컨트롤러 등록시 신호 서비스에서 이벤트를 구독하십시오.

기존 AngularJS와 signalR 모듈이 가능한 솔루션도있다 : https://github.com/JustMaier/angular-signalr-hub

관련 문제