SignalR (v2.2.0) OnDisconnected Benutzer offline setzen

Ich verwende den folgenden Code, um Benutzer in Gruppe hinzuzufügen und Benutzer in Datenbank für diese bestimmte Gruppe mit dem folgenden Code zu speichern.

SERVER

  public class ChatHub : Hub
{


    public async Task JoinRoom(string user_Id, string room_Id, string user_Name)
    {
        AddLoginUser(room_Id, this.Context.ConnectionId, user_Id);
        await this.Groups.Add(this.Context.ConnectionId, room_Id);
    }


    public void Connect(string user_Id, string room_Id, string user_Name)
    {
        var id = Context.ConnectionId;

        Clients.Caller.onConnected(id, user_Name, GetRoomUser(room_Id), GetRoomMessage(room_Id));

        // send to all in group to update user list
        Clients.OthersInGroup(room_Id).onNewUserConnected(id, user_Name);
    }
  public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
    {

        using (DataContext dc = new DataContext())
        {
            var item = dc.LoggedInUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            if (item != null)
            {
                item.Connected = false;
                dc.SubmitChanges();

                Clients.OthersInGroup(item.RoomID.ToString()).onUserDisconnected(Context.ConnectionId, item.UserMaster.User_Name);
            }

            return base.OnDisconnected(stopCalled);
        }
    }
   }

 private void AddLoginUser(string room_Id, string connection_Id, string user_Id)
    {
        using (DataContext dc = new DataContext())
        {
            var checkUserLogedIn = (from user in dc.LoggedInUsers
                                    where (user.RoomID == Convert.ToInt32(room_Id) && user.UserID == Convert.ToInt32(user_Id))
                                    select user).SingleOrDefault();
            if (checkUserLogedIn == null)
            {
                LoggedInUser objLoggedInUser = new LoggedInUser();
                objLoggedInUser.ConnectionId = connection_Id;
                objLoggedInUser.UserID = Convert.ToInt32(user_Id);
                objLoggedInUser.RoomID = Convert.ToInt32(room_Id);
                objLoggedInUser.Connected = true;
                dc.LoggedInUsers.InsertOnSubmit(objLoggedInUser);
                dc.SubmitChanges();
            }
            else
            {
                if (!checkUserLogedIn.Connected)
                {
                    checkUserLogedIn.Connected = true;
                    dc.SubmitChanges();
                }
            }
        }
    }

Problem

Angenommen, ich habe mich mit userid = 1 für roomid = 1 und contextid = 123asd angemeldet. Wenn ich mein Fenster aktualisiere, ändert sich die Kontext-ID. Wenn ich jetzt die Browser-Registerkarte schließe, wird die folgende Abfrage ausgeführt:

var item = dc.LoggedInUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);

Den Benutzer nicht anhand der neuesten Verbindungs-ID herausfinden, da die Verbindungs-ID bei der Speicherung des Benutzers bei der Verbindung zu diesem Zeitpunkt unterschiedlich war.

Wie kann ich den Verbindungsstatus für einen bestimmten Benutzer bei einem Trennungsereignis auf falsch setzen?

Danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage