Memorizzare la sessione in una variabile statica?

1

Attualmente sto controllando un vecchio pezzo di codice C # usato per mantenere una sessione di accesso.

public static ZRWebserviceSession CurrentSession { get { return _currSession; } set { _currSession = value; } }
private static ZRWebserviceSession _currSession;


public static bool IsSessionActive()
{
    if (_currentSession == null || !_currentSession.IsOpen || !_currentSession.IsLoggedIn) {
         return false;
    }
    return true;
}

Mi è sempre stato detto che usare i globals è una cattiva pratica e sto cercando dei modi per migliorare questo pezzettino di codice eliminando almeno il campo statico usato per mantenere la sessione.

La situazione attuale è la seguente:

All'avvio dell'applicazione, l'oggetto sessione viene avviato con un indirizzo server (preso da un file di configurazione) a cui dovrebbe connettersi. L'oggetto recupera quindi i dati della sessione (token, ecc.) Dal server per archiviarli in sé e viene quindi assegnato alla variabile statica per l'accesso attraverso l'intera applicazione. Questo viene fatto solo all'inizio dell'esecuzione dell'applicazione o quando l'utente riavvia esplicitamente la sessione.

Mentre una sessione è attiva, altri pezzi di codice possono chiamare i metodi sull'oggetto di sessione per recuperare i dati di sessione ed effettuare chiamate al servizio web connesso.

Questo può essere migliorato? L'uso dei globals è ancora una cattiva pratica se usato per sessioni o qualcosa di simile a questo?

EDIT: per chiarire che tipo di applicazione si tratta: questa non è un'applicazione web ma un'applicazione client che si connette a un servizio web. ZRWebserviceSession è un oggetto libreria che rappresenta una sessione di accesso per l'utente che attualmente utilizza l'applicazione client. Un po 'come l'oggetto della sessione del link di Fabebook SDK.

    
posta Leon Lucardie 13.05.2014 - 12:26
fonte

1 risposta

3

Non memorizzare mai le sessioni in una variabile statica!

Variabile statica significa che quando un altro utente effettua l'accesso, la variabile statica verrà aggiornata con la nuova sessione e il primo utente funzionerà sotto la sessione dell'ultimo utente. Mai utente statico variabile in un'applicazione web.

L'unico caso in cui utilizzo variabili statiche è con costanti (che sono statiche per impostazione predefinita);

Aggiornamento:

Bene, un buon uso della variabile statica con sessione potrebbe essere che quando l'utente accede, salva l'oggetto utente in sessione e poi fa questo:

    var user = GetUser('username','password');

    if(user == null){
      throw new NullReferenceException("user does not exists! login failed");
   }

    else{
    Session["currentuser"] = user;

    }

Quindi ora puoi fare questo:

public class Globals{

  public static User GetCurrentUser()
  {
     return (User)System.Web.HttpSessionStateBase["currentuser"];
  }
}

In modo che quando hai bisogno delle informazioni sull'utente corrente chiami semplicemente Globals.GetCurrentUser() .

    
risposta data 13.05.2014 - 14:38
fonte

Leggi altre domande sui tag