2013-12-11 2 views
4

SignalR을 사용하는 두 브라우저 클라이언트간에 채팅 웹 앱이 있다고 상상해보십시오. 클라이언트 중 한 명이 실수로 F5를 눌렀을 때 생존하는 가장 좋은 방법은 무엇입니까?SignalR : 실수로 페이지 새로 고침을 견뎌내는 방법

Here은 쿠키를 맞춤형 SignalR IConnectionIdFactory와 함께 사용하는 전략에 대해 설명합니다. 그러나 기사 작성자는 "SignalR 팀은이 작업을 권장하지 않습니다"라고 말합니다.. 그렇다면 권장 아키텍처는 무엇입니까?

답변

6

클라이언트가 연결될 때 임시 연결 ID를 영구 사용자 ID/이름 (DB에 저장 될 수 있음)에 매핑 할 수 있습니다. 이 작업을 수행하는 ShootR example을 참조하십시오 (적어도 마지막으로 확인했을 때). 이와 유사한 예를 들어, 당신이 활성 사용자를 추적하는 사용자를 나타내는 개체의 ConcurrentDictionary을 유지할 수 있고 OnConnected 자신의 연결 식별자와 연결 (및 OnDisconnected이 되돌릴) :

private static readonly ConcurrentDictionary<string, User> Users 
    = new ConcurrentDictionary<string, User>(); 

public override Task OnConnected() { 
    string userName = Context.User.Identity.Name; 
    string connectionId = Context.ConnectionId; 

    var user = Users.GetOrAdd(userName, _ => new User { 
     Name = userName, 
     ConnectionIds = new HashSet<string>() 
    }); 

    lock (user.ConnectionIds) { 
     user.ConnectionIds.Add(connectionId); 
    } 

    return base.OnConnected(); 
} 
관련 문제