2013-01-04 12 views
40

Le variabili statiche mantengono i loro valori nelle sessioni utente?Ambito della variabile statica nell'applicazione Web ASP.NET multiutente

Ho un'applicazione Web ASP.NET in cui ho due pulsanti. Uno per impostare il valore della variabile statica, un altro per Mostrare il valore della variabile statica.

namespace WebApplication1 
{ 

public partial class WebForm1 : System.Web.UI.Page 
{ 
    public static int customerID; 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void ButtonSetCustomerID_Click(object sender, EventArgs e) 
    { 
     customerID = Convert.ToInt32(TextBox1.Text); 
    } 

    protected void ButtonGetCustomerID_Click(object sender, EventArgs e) 
    { 
     Label1.Text = Convert.ToString(customerID); 
    } 
} 

} 

Anche se questo funziona in ambiente di singolo utente, che cosa succede se ci sono 2 utenti contemporaneamente registrati da due computer, utente 1 set il valore come 100, quindi l'utente 2 set il valore come 200. dopo che l'utente 1 richiama il pulsante Ottieni valore. Cosa vedrà come valore?

+0

See la mia domanda/risposta: https://stackoverflow.com/questions/12642136/asp-net-static-classes-and-asp-net-sessions – BlueChameleon

risposta

57

Le variabili statiche mantengono i loro valori nelle sessioni utente?

Sì, è per questo che dovresti essere MOLTO attento quando si utilizzano variabili statiche in un'app Web. Si eseguiranno problemi di concorrenza poiché più thread che gestiscono una richiesta possono modificare il valore della variabile.

Anche se questo funziona in ambiente monoutente, cosa succede se ci sono 2 utenti contemporaneamente registrati da due computer, utente 1 imposta il valore come 100, quindi l'utente 2 set il valore come 200. dopo che l'utente 1 richiama il pulsante Ottieni valore. Cosa vedrà come valore?

L'utente ne vedrà 200 in seguito.

19

L'ambito delle variabili statiche è Livello applicazione.

Se si memorizza qualcosa in variabili statiche, allora si sta facendo qualcosa di sbagliato.

Se un utente salva i dati, la stessa volta che un altro utente accede alla stessa pagina, riceverà anche gli stessi dati. Quindi meglio è possibile memorizzare i valori in Sessioni.

+0

le variabili Session possono essere configurate per utilizzare la memoria? Ho una situazione in cui un utente API non memorizza o recupera i cookie e non voglio un hit del database, è qualcosa che accade più volte al secondo. –

1

Questo potrebbe funzionare per voi (tenere a mente, è necessario gestire i valori null/-1):

public static int customerID 
{ 
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; } 
    set { session["customerID"] = value; } 
} 
+4

Non è possibile accedere direttamente alle variabili di sessione come "Sessione" da un get o set accessor statico. Devi invece usare HttpContext.Current.Session. –

+0

@StanShaw +1 .... –

-1

Non utilizzare statica per la proprietà allora funziona:

public int customerID 
{ 
    get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; } 
    set { Session["customerID"] = value; } 
}