32 messaggi dal 13 agosto 2017
ok eccolo:

 Public Overrides Function OnDisconnected(stopCalled As Boolean) As Threading.Tasks.Task

            Dim item = ConnectedUsers.FirstOrDefault(Function(x) x.ConnectionId = Context.ConnectionId)
            If item IsNot Nothing Then
                ConnectedUsers.Remove(item)
                Dim id = Context.ConnectionId

                Clients.All.onUserDisconnected(id, item.UserName)
            End If

            Return MyBase.OnDisconnected(stopCalled)
        End Function
10.378 messaggi dal 09 febbraio 2002
Contributi
Ok, vedi che Clients.All.onUserDisconnected viene chiamato immediatamente, al verificarsi dell'OnDisconnected nell'hub. Tu invece dovresti fare in modo che venga chiamato più tardi, solo se sono trascorsi almeno una ventina di secondi.

Proviamo a realizzarlo in questo modo e a vedere se promette bene: nell'OnDisconnected limitati ad inserire l'utente in un dizionario dei "DisconnectedUsers". Assegna all'utente la data/ora corrente, momento in cui è stato visto online per l'ultima volta.
Public Overrides Function OnDisconnected(stopCalled As Boolean) As Threading.Tasks.Task
            Dim item = ConnectedUsers.FirstOrDefault(Function(x) x.ConnectionId = Context.ConnectionId)
            If item IsNot Nothing Then
                item.LastSeenOnline = DateTime.Now
                DisconnectedUsers.Add(id, item)
            End If

            Return MyBase.OnDisconnected(stopCalled)
        End Function

LastSeenOnline è una proprietà DateTime che dovrai creare nella classe dell'utente.

Se l'utente si ricollega entro i 20 secondi, rimuovilo dai DisconnectedUsers. Puoi sapere se si è ricollegato entro 20 secondi cercandolo nel dizionario DisconnectedUsers e facendo la differenza di DateTime.Now con LastSeenOnline.

Altirmenti, ci sarà un timer con intervallo di 5 o 10 secondi che va ad esaminare di continuo il contenuto del dizionario DisconnectedUsers. Se il valore di LastSeenOnline è ormai vecchio di 20 secondi, allora esegui questa logica.
ConnectedUsers.Remove(item)
DisconnectedUsers.Remove(id)
Clients.All.onUserDisconnected(id, item.UserName)


Ci sono vari modi per eseguire un'operazione periodica in background.
https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

Ovviamente valuta tu se vale la pena di implementare tutto ciò.
Una cosa che dovresti controllare subito è che il tuo codice sia thread-safe. Di che tipo è ConnectedUsers? Se è una List non va bene, devi usare un ConcurrentDictionary che è thread safe. Usa il Context.ConnectionId come chiave e l'item come valore. Questo ci vuole 10 minuti a cambiarlo.

ciao,
Moreno
Modificato da BrightSoul il 07 febbraio 2018 23.42 -

Enjoy learning and just keep making
32 messaggi dal 13 agosto 2017
Ciao BrightSoul, allora il tuo discorso è ok ma c'è un però....parto con un esempio così da far capire il mio dubbio. Ci sono attualmente 2 utenti connessi, vado io di login quindi siamo in 3 utenti connessi. Applicando il tuo stratagemma, se faccio il refresh della pagina teoricamente siamo in 4 connessi perchè con il refresh si crea un nuovo id (credo) e dopo i fatidici 20 secondi applicando il tuo codice ritorniamo ad essere in 3! O sbaglio? Avevo visto una cosa del genere ma non l'ho capito...è un discorso simile a quello che mi hai detto tu di fare?
https://blogs.msmvps.com/ricardoperes/2015/10/29/persisting-signalr-connections-across-page-reloads/
Potrebbe fare al mio caso?
Un grande grazie come sempre.
Modificato da MarkRoss il 08 febbraio 2018 14.42 -
10.378 messaggi dal 09 febbraio 2002
Contributi
Ciao,


si crea un nuovo id (credo)

Il ConnectionId può anche rigenerarsi però tu devi essere in grado di riconoscere l'utente in base ad un altro valore, come il suo username.
Gli utenti della tua chat hanno fatto il login con username e password? Se si, puoi riconoscere l'utente in base al valore di User.Identity.Name.

L'articolo che hai postato è adatto al tuo caso e spiega un modo alternativo per riconoscere l'utente.
In pratica, ti generi un codice casuale sul client e lo memorizzi su un cookie o sul local storage del browser. Tale codice resterà sempre lo stesso anche se si dovesse aggiornare la pagina. Invia il codice a SignalR subito dopo esserti connesso all'hub che provvederà ad aggiornare le liste ConnectedUsers e DisconnectedUsers. Questa soluzione funzionerà anche con utenti che non hanno fatto il login.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.