Canvas를 이용해 개발중에 있는데 동일한 방에 들어와있는 유저들에게 같은 object를 공유하기 위해서 SignalR을 사용하였습니다.
그런데 이상하게 이미 방에서 나간 유저의 정보가 계속 남아, 방에 이미 나간 유저의 정보가 계속 보여서 혼란이 생기는 걸 확인한 뒤 OnDisconnected 메서드를 확인해봤습니다.
OnDisconnected 메서드에서는 분명 Array에 있는 유저를 해제 시키는 작업을 하고 있는데 왜 유저 정보가 나올까 해서 디버그를 잡고 돌려봤더니 해당 메서드가 호출되지 않는 것을 확인했습니다.유저가 방을 나갔음을 인지하는 건 브라우저의 종료입니다. 검색을 해보니 Chronium 엔진을 사용하는 브라우저에서만 발생하는 것 같았습니다.실제로 IE나 FireFox에서는 정상적으로 OnDisconnected가 호출되어 유저가 해제되는 것을 확인했습니다.제가 사용하는 Edge 버전은 90.0.818.41 이고, Chrome 버전은 90.0.4430.72입니다.해결방법은 다음과 같습니다.
window.onbeforeunload = function (e) {
$.connection.hub.stop();
};
브라우저가 언로드 될 때 hub가 stop 되도록 직접 명령하는 것입니다.
왜 브라우저가 닫힐 때 즉각적으로 stop 액션이 취해지지 않는지 확인해보려고 했으나 추측만 가능할 수 있었습니다.
모종의 이유로 Timeout 시간이 지나야지만 stop 액션이 실행되는 것 같습니다.
timeout 시간은 30초로 전송 연결이 끊어진 후 대기하는 시간을 나타냅니다. 아마 signalR 연결이 잘못해서 끊어질 경우에 새로 connection을 맺을 대기 시간을 주는 것 같습니다.
하지만 브라우저가 닫힐 때에는 명백하게 close가 되야하는 시점이므로 직접 호출하면 되겠습니다.
여유가 될 때 signalR 소스에 브라우저가 닫힐 때에는 close가 되도록 코드를 추가해야할 것 같습니다.
만약 reject된다면 이유를 명확하게 설명해주겠지요..ㅜ