Domanda

Sto lavorando su un'applicazione Windows. Devo simulare Session (che abbiamo in un'app Web) nell'app win in cui se l'utente è inattivo per un certo periodo, viene disconnesso. Lo stato di accesso dell'utente è mantenuto nel database.

Qualche idea innovativa ???

È stato utile?

Soluzione

Non hai bisogno di Session (o CallContext, o altro), solo un Singleton "archivio utenti" con una limitazione:

Dopo che l'utente ha effettuato l'accesso o mostrato un'attività, è necessario salvare la data / ora. La prossima volta, quando l'utente vuole fare qualcosa, confronta (lastactivity + logouttime) con la data / ora effettiva.

Lo schema del processo potrebbe essere:

              [User login]
                   |
                   !
 [User 'store' saves user date + login time]
 [This is a singleton                      ]

                  ...

[Next time user wants to do something. The   ]
[program asks user data from the user 'store']
                   |
                   !
[If the actual time is greater than user     ]
[lastactivity + LOGOUTTIME, user cannot do it]
[If not, then update last activity           ]

UserStore può essere implementato come Dizionario e utilizzato come:

// Log in
Singleton.UserStore.Add("John", new UserData( yourUserObject, DateTime.Now));

...

// Check (ie. in a property-get)
var userData = Singleton.UserStore["John"];
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now()) 
{
   throw UserAutomaticallyLoggedOut();
}
else
{
   userData.LastActivityDate = DateTime.Now();
}

Altri suggerimenti

Ciò che viene in mente è usare un BackgroundWorker per disconnettere l'utente quando un timer raggiunge lo zero. Questo timer viene ripristinato ad ogni azione eseguita dall'utente. Oppure potrebbe anche essere agganciato agli eventi del mouse o della tastiera in modo che quando l'utente non sposta il mouse o non utilizza la tastiera, il timer esegue il conto alla rovescia fino al raggiungimento del tempo di disconnessione.

È possibile creare una classe nell'applicazione con una sorta di timeout che viene ripristinata ogni volta che l'utente interagisce con il software. Se viene raggiunto il timeout, l'utente viene disconnesso.

La cosa difficile qui è rilevare l'interazione dell'utente. In ASP.NET è abbastanza semplice, essenzialmente è necessario controllare solo le richieste di pagina. In un'applicazione Windows Form dovrai montare l'input su un livello molto più dettagliato (qualsiasi pressione di un tasto in qualsiasi casella di testo sarà un'interazione dell'utente per esempio). Immagino che la proprietà KeyPreview insieme a un listener di eventi KeyPress sul modulo potrebbe essere un buon modo per andare avanti.

Bene, per prima cosa cosa intendi con inattivo? Sul Web si sta tentando di simulare lo stato in cui non esiste nessuno. Tuttavia, in un'app client, ricevi tutti i tipi di eventi anche con MouseMove. L'unica idea è che potresti creare UserControls dai controlli di input standard come TextBox, Button e così via e farli aggiornare una sorta di oggetto timer quando vengono invocati gli eventi. L'altro è rinunciare al materiale UserControl e aggiornare semplicemente il timer in ogni gestore di eventi creato. Probabilmente sarebbe più semplice aggiornare il timer in base agli eventi MouseMove o KeyDown sul modulo stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top