IIS 7.5 및 Windows Server 2008 R2에서 SignalR 긴 풀링이 자동으로 연결 해제됨

IIS 7.5 및 Windows Server 2008 R2에서 SignalR 긴 풀링이 자동으로 연결 해제됨

(StackOverflow에 이런 질문을 했습니다., 여기에는 제가 생략한 코드가 포함되어 있지만, 제가 겪고 있는 네트워크 문제이기 때문에 여기에도 물어보는 것이 적절할 것 같습니다.)

Windows Server 2008 R2(프로덕션 환경)의 IIS 7.5에서 호스팅되는 SignalR이 포함된 API(WebAPI)가 있고 Windows 10에서 실행되는 데스크톱 애플리케이션을 통해 허브에 연결합니다.

LongPollingTransport로 연결을 설정할 때 문제가 발생합니다(서버 구성으로 인해 이를 명시적으로 사용합니다. 제가 아는 한 WebSocket은 Windows Server 2008 R2에서 작동하지 않습니다). 처음에는 클라이언트가 성공적으로 연결되고 연결이 SignalR의 허브에서 성공적으로 수신되었습니다.

그러나 클라이언트는 분명히 연결이 끊어졌지만 클라이언트는 위에서 설명한 대로 연결 끊김 이벤트를 포착하지 못합니다. 실제로 클라이언트에 데이터를 보내야 하는 API 엔드포인트를 호출할 때가 아니라는 것을 알더라도 "연결된" 상태를 유지합니다.

이 문제는 해당 프로덕션 환경에서만 발생하지만 로컬/개발 환경(Windows 10)과 테스트 환경(Windows Server 2012) 모두에서 테스트한 결과 정상적으로 작동했습니다. 로그가 활성화되면 프로덕션 환경에서 TransportHeartBeat의 "사용 중지" 메시지가 발생하는 것을 볼 수 있습니다.

SignalR.Transports.TransportHeartBeat Information: 0 : Connection 96c15a60-dd1d-47fb-ac57-ea898712738f is New.
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 96c15a60-dd1d-47fb-ac57-ea898712738f
SignalR.Transports.LongPollingTransport Information: 0 : Abort(96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.LongPollingTransport Information: 0 : End(96c15a60-dd1d-47fb-ac57-ea898712738f)

한편, 로컬 또는 테스트 환경에서는 로그에 "KeepAlive" 메시지가 표시됩니다(프로덕션 환경에서는 이 메시지가 발생했으면 좋겠습니다).

SignalR.Transports.TransportHeartBeat Information: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d is New.
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)

또한 내 클라이언트 응용 프로그램에는 서버에 데이터를 보내는 방법이 있습니다. Fiddle로 진단할 때 로컬 또는 테스트 환경에서 클라이언트가 시작한 긴 풀링 연결은 클라이언트가 일부 데이터를 보낼 때까지 활성 상태로 유지된 다음 서버에서 데이터 없이 연결이 끝나고 다른 연결이 시작되는 것을 확인했습니다. 한편, 테스트 환경에서는 클라이언트가 데이터를 보내도 긴 풀링 연결이 계속 진행됩니다. 서버가 처음에 클라이언트 연결을 식별하지 않기 때문에 이런 일이 발생한다고 생각하지만 그 동작을 언급하는 것이 유용할 것이라고 생각했습니다.

그래서 저는 다음 사항을 알고 싶습니다.

  1. LongPoolingTransport가 작동하도록 하려면 IIS에서 구성해야 할 사항이 있습니까?
  2. 내 클라이언트가 왜 여전히 연결되어 있다고 "생각"하는지 아시나요?
  3. 긴 풀링 요청이 이렇게 삭제되는 원인은 무엇입니까? 어떻게 진단할 수 있나요?

감사해요!

관련 정보