2013-06-04 2 views
2

SignalR 클라이언트는 연결된 동안 서버에서 오는 메시지를 놓치지 않아야합니다. 긴 폴링을 사용하는 경우에는 그렇지 않습니다.SignalR - 긴 폴링을 사용하여 OnReconnected를 호출하지 않음

SignalR 1.1.2를 사용하는 간단한 허브 기반 애플리케이션이 있습니다. SSE를 사용할 때 네트워크 케이블이 연결 해제되어 있고 시간 초과 기간 내에 다시 연결되면 클라이언트와 서버 모두 다시 연결이 발생했다는 알림을받으며 알 수있는 한 메시지가 누락되지 않습니다. 긴 폴링을 사용하면 다음과 같이 나타납니다.

  • 연결이 생성되면 ($ .connection.hub.start()) 허브에서 OnConnected 메서드가 호출되고 클라이언트가 연결된 상태가됩니다.
  • 그런 다음 네트워크 케이블의 플러그를 뽑았다가 신속하게 다시 팝하면 OnDisconnected 또는 OnConnected에 대한 호출이 없습니다. 메시지가 누락되지 않습니다. 서버에서 대기중인 모든 메시지는 이후에 클라이언트로 전송됩니다. 지금까지 OK.
  • 네트워크 케이블을 분리하고 긴 폴링이 만료되도록 설정하면 OnDisconnected가 호출됩니다. 클라이언트에는 상태 변경이 없습니다.
  • 네트워크 케이블을 다시 연결하면 클라이언트에서 메시지 수신이 다시 시작됩니다. 클라이언트에게 연결이 끊어 졌음을 알리지는 않았지만 클라이언트는 일부 메시지를 놓쳤습니다. 서버에 OnReconnected 또는 OnConnected 호출이 없습니다.

이것은 버그입니까? 이 동작은 SSE와 긴 폴링간에 매우 다른 것처럼 보입니다. 클라이언트가이 시나리오에서 메시지를 놓치지 않도록 권장 전략이 있습니까? 서버에서 연결 ID를 추적하고 클라이언트에서 주기적으로 ping을 보낼 수 있습니다. OnDisconnected 후에 ping을 받으면 클라이언트에 다시 동기화하라는 메시지를 보낼 수 있지만이 작업은 올바른 작업이 아닌 것 같습니다. . 제안 사항이 있으십니까?

답변

2

WebSockets, Server Sent Events 및 Forever Frame은 모두 클라이언트 연결 유지를 위해 클라이언트 측 연결 유지를 사용합니다. 그러나 Long Polling은 기술적 한계로 인해 클라이언트 측 Keep Alive 기능을 사용하지 않으며 네트워크 케이블을 빼는 것과 같은 이벤트에 대한 연결성을 보장하지 않습니다.

나는 Long Polling 전송이 더 이상 SignalR에 의해 보장 될 수는 없지만 Long Polling의 ajax 연결에서 정확한 이벤트를 트리거하기 위해 Browser에 의존한다고 간단히 말합니다 (이를 통해 SignalR이 응답 할 수 있음). 에).

클라이언트가 네트워크 케이블을 뽑은 후 서버와의 연결을 다시 얻으면 다운 타임 중에 놓친 메시지를 받게됩니다. 따라서 메시지를 놓치지 않고 그냥 지연됩니다.

마지막으로 서버가 클라이언트를 오랜 시간 동안 보지 못하는 경우 OnDisconnected 이벤트가 트리거됩니다. 네트워크 케이블을 꺼내는 것과 같은 상황에서이 문제가 발생하면 서버는 현재 연결 요청을 먼저 시간 초과 한 다음 연결 자체를 시간 초과합니다. 즉, OnDisconnected 이벤트에 여전히 의지 할 수 있으며 네트워크 조건에 따라 지연 될 수 있습니다.

은 soooo는 당신이보고있는 것은 디자인 100 % =)이 도움이

희망입니다!