Ottieni un elenco di utenti che attualmente utilizzano un'applicazione

3

Che cosa devo fare:

Mi è stato chiesto di aggiungere una funzionalità a una delle nostre applicazioni che consentirebbe a un supervisore di inviare un messaggio a tutti oa uno degli utenti che attualmente utilizzano l'applicazione.

L'applicazione è un'applicazione winform che utilizza c # ed ef6 con un database mysql e utilizza un server RabbitMQ per scopi diversi.

La mia domanda:

Come posso ottenere o mantenere un elenco di utenti che stanno attualmente utilizzando l'applicazione?

Soluzione 1:

Accedi a un database che sta attualmente utilizzando l'applicazione.

Lo abbiamo fatto in passato per un'altra applicazione, ma non era affidabile perché se l'utente uccide l'applicazione o perde una connessione al database, non scriverà sul database se si disconnette.

Soluzione 2:

Potrei usare il server RabbitMQ. Ogni utente invia un messaggio di "presenza" ogni x secondi per comunicare agli altri utenti che sono ancora connessi. Ogni volta che l'applicazione riceve un messaggio di questo tipo, aggiunge l'utente a un elenco o semplicemente aggiorna l'elenco se l'utente è già nell'elenco. Se un utente non invia un messaggio di "presenza" dopo x secondi, verrà considerato disconnesso.

Sto pensando troppo a questo? C'è un modo migliore per implementare una cosa del genere?

Modifica: sto cercando di evitare di avere un server centrale che manterrebbe la lista degli utenti.

    
posta Kinetic 21.07.2016 - 19:44
fonte

4 risposte

1

La soluzione più fattibile è una variante di Websockets . Fortunatamente C # lo supporta . Quando un utente avvia l'applicazione, viene creata una connessione tra lui e un server che indica che l'applicazione viene eseguita. Quando l'applicazione viene chiusa (correttamente o eliminata), il processo termina e così avviene la connessione.

C'è un problema, però. La tua attuale architettura, da quello che ho capito, non la supporta. Avrai bisogno di un server in grado di elaborare connessioni WebSocket per fungere da listener e gestore dei tuoi utenti attivi. Tramite questo server è possibile inviare eventi a loro (i WebSocket sono bidirezionali, il che significa che supporta sia le comunicazioni client-gt; server e server- > client).

Aggiornamento: non sono un programmatore C #, ma sembra esserci anche signalR . Potresti voler controllare anche quello.

    
risposta data 21.07.2016 - 20:19
fonte
0

Alcuni dei tuoi vincoli architetturali sono:

  • Macchine workstation client che eseguono l'applicazione Win nativa
  • Nessun server centralizzato
  • Database centralizzato
  • Interfaccia MQ in uscita

L'unica soluzione fattibile e scalabile che posso vedere sotto questi vincoli sono:

  • Mantieni una tabella delle sessioni utente
  • La tabella delle sessioni utente viene regolarmente aggiornata ogni [intervallo] con un timestamp per dimostrare che l'applicazione è ancora attiva, la data / ora è annullata quando viene spenta correttamente
  • Nuova funzione implementata per il ruolo Supervisore nell'applicazione
  • La schermata delle caratteristiche consente di pubblicare un messaggio e di inviarlo a tutti con un timestamp attuale e valido nel database
  • ?? Non ho idea di che tipo di messaggio ?? Sullo schermo? E-mail? Supponendo che l'e-mail, l'istanza dell'applicazione supervisor invierà direttamente a un relay SMTP o a una coda in MQ che viene rilevata da un server di posta.
risposta data 21.07.2016 - 21:26
fonte
0

Utilizza l'evento StateChange di DbConnection. AddToTable aggiungerebbe il login dell'utente a una tabella sul server, removeFromTable lo cancellerebbe.

   private void StateChange(object sender, StateChangeEventArgs e)
    {
        var connectionState = e.CurrentState;
        switch (connectionState)
        {
            case ConnectionState.Open:
                addToTable @user
                break;
            default:
                removeFromTable @user
            break;
        }

    }
    
risposta data 10.08.2016 - 20:50
fonte
0

C'è un modo decentralizzato per farlo se non colpire attivamente un server è davvero così importante.

Possiedi il cliente in modo da poterlo fare peer to peer. Peer-to-peer è un modo elegante per dire "è sia un client che un server"

Quindi ora quando un client si connette ha bisogno di un modo per sapere chi sono gli altri client. Be 'schifo sono tornati per aver bisogno di un server. Ma questa lista riguarda solo l'apprendimento di chi potrebbe essere là fuori. Accedi. Segnala un IP e una porta su cui ascolterai se qualcuno vuole controllare il tuo stato.

Ma ma sicurezza!

Se non ti fidi del fatto che il client risponda effettivamente quando ti viene chiesto, puoi testare una risposta quando accedono. Molti server IRCd fanno esattamente questo per assicurarti di essere sull'ip che ritieni di essere presente.

È un bel po 'di chiasso, ma evita il polling sulla rete. Chiedete solo a chi è attivo quando vieni a sapere chi c'è.

    
risposta data 10.08.2016 - 21:11
fonte

Leggi altre domande sui tag