2014-06-19 4 views
1

나는 OnConnected 및 OnDisconected를 사용하여 사용자 트랩을 유지하고 메모리를 줄입니다.SignalR 상태 변수에 값을 저장하는 방법

내 문제는 SignalR에서 어떤 변수도 할당 할 수 없다는 것입니다. 다음 코드를 사용하고 있습니다.

Clients.Caller.userid를 읽을 때 항상 null입니다. 그러나 xxSameProcess 변수가 null이 아닌 값을 할당 한 후 즉시 읽을 수 있습니다.

내가 무엇을 누락 되었습니까? 이

 <script src="~/signalr/hubs"></script> 
     <script type="text/javascript"> 
      (function ($) { 
       //some stuff 
       $.connection.hub.qs = { 'uid': '@guid' }; 
       $.connection.hub.start(); 
      })(jQuery); 
     </script> 

를 연결할 때

내 옆에
public override System.Threading.Tasks.Task OnConnected() 
    { 
     var user = CreateUser(); 
     Clients.Caller.userid = user.UserId; 
     object xxSameProcess = Clients.Caller.userid; 

     return base.OnConnected(); 
    } 
    public override System.Threading.Tasks.Task OnDisconnected() 
    { 
     object xx = Clients.Caller.userid; 

     CreateDelete(Clients.Caller.userid); 

     return base.OnConnected(); 
    } 
+0

난 단절 후에 상태 객체가 더 이상 사용 가능하지 않다는 것을 확실히 확인하십시오 (연결 해제 후 이벤트가 트리거 됨). 일반 허브 메서드에서 사용자 ID에 액세스하려고 시도하면 다시 확인할 수 있습니다. 나는 또한 당신이 달성하고자하는 것에 대해 ConnectionId를 사용할 수 있다고 생각합니다. – Wasp

+0

onConnected 및 OnDisconnected 변수를 저장할 수없는 것 같습니다. –

답변

1

, 내가 클라이언트에서 내 변수를 저장, 나는 쿼리 문자열을 서버에서 액세스 할 수

public override Task OnConnected() 
    { 
     var uid = Context.QueryString["uid"]; 
     //some stuff 

    return base.OnConnected(); 
} 

public override Task OnDisconnected() 
{ 
    var uid = Context.QueryString["uid"]; 
    //some stuff 

    return base.OnDisconnected(); 
} 

public override Task OnReconnected() 
{ 
    var uid = Context.QueryString["uid"]; 

    //some stuff 

    return base.OnReconnected(); 
} 
+0

이것을 UserIdProvider와 결합하는 것이 좋습니다. 그런 다음 모든 호출을 제거하여 쿼리 문자열에서 가져올 수 있습니다. – KingOfHypocrites

+0

내 상황에서는 UserIdProvider와 현재 사용자가 다를 수 있기 때문에이 작업을 추가합니다 (사양이었습니다). – Daniel

+0

사용자 ID 공급자는 원하는대로 수행 할 수 있습니다. 거기에는 조건부 논리가있을 수도 있습니다. 공용 클래스 UserIdProvider : IUserIdProvider { 공용 문자열 GetUserId (IRequest 요청) { string userId = request.QueryString [ "vid"]; if (userId.IsEmpty()) { if (request.User.Identity.IsAuthenticated) { return request.User.Identity.Name; } return null; } return userId; } } – KingOfHypocrites

관련 문제