2017-06-01 2 views
0

OnDisconnected Ich versuche, Benutzer von Benutzernamen zu bekommen, ist mein Code innerhalb der OnConnected Methode arbeiten, aber in OnDisconnected ich bin Object reference is not set to an instance of an object dieses immer ist mein Code:Erste Objektverweis nicht auf eine Instanz eines Objekts festgelegt innerhalb SignalR

Arbeiten hier:

public override async Task OnConnected() 
{ 
    var id = Context.ConnectionId; 
    var userName = Context.User.Identity.Name; 
    var connectedUser = new ChatUserModel(); 

    var existingUserResponse = await _client.GetAsync("chats/users/" + userName + "/"); 
    if (existingUserResponse.IsSuccessStatusCode) 
    { 
     var existingUserResult = existingUserResponse.Content.ReadAsStringAsync().Result; 

     var existingUser = JsonConvert.DeserializeObject<ChatUserModel>(existingUserResult); 
      existingUser.connectionId = id; 
     connectedUser = await AddOrUpdateUser(existingUser); 
    } 

    var response = await _client.GetAsync("chats/users"); 
    var result = response.Content.ReadAsStringAsync().Result; 
    var users = JsonConvert.DeserializeObject<List<ChatUserModel>>(result); 

    Clients.Client(id).userConnected(users); 
} 

Aber nicht hier in:

public override async Task OnDisconnected(bool stopCalled) 
{ 
    var userName = Context.User.Identity.Name; 

    try 
    { 
     var response = await _client.GetAsync("chats/users/" + userName + "/"); 
    } 
    catch (Exception ex) 
    { 
     string msg = ex.Message; 
    } 
    //var existingUserResult = existingUserResponse.Content.ReadAsStringAsync().Result; 
    //var existingUser = JsonConvert.DeserializeObject<ChatUserModel>(existingUserResult); 
    //existingUser.connectionId = ""; 

    //var connectedUser = await AddOrUpdateUser(existingUser); 
} 

Antwort

0

OnDisconnect Verfahren vom Server ruft nicht von clie deswegen ist der Benutzer null.

Für diese Bedingung Handhabung sollten Sie connectionIds mit Benutzer entsprechen und irgendwo speichern und in OnDisconnect können Sie Benutzer erreichen durch ConnectionId

public override async Task OnConnected() 
{ 
    var id = Context.ConnectionId; 
    var userName = Context.User.Identity.Name; 
    SaveUserToDb(id,userName);// 
    // other codes 
} 

public override async Task OnDisconnected(bool stopCalled) 
{ 
    var id = Context.ConnectionId; 
    var userName = GetUserNameFromDB(id); 

    // and now you have your username 
} 
+0

können Sie ein Beispiel geben? –

+0

Ich habe die Antwort bearbeitet. –

+0

hast du es versucht? –

Verwandte Themen