2013-01-04 5 views
40

Behalten statische Variablen ihre Werte in Benutzersitzungen bei?Bereich der statischen Variable in ASP.NET-Webanwendung mit mehreren Benutzern

Ich habe eine ASP.NET-Webanwendung, wo ich zwei Schaltflächen habe. Eine zum Festlegen des statischen Variablenwerts, eine weitere zum Anzeigen des statischen Variablenwerts.

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); 
    } 
} 

} 

Während dies im Single-User-Umgebung arbeitet, Was passiert, wenn es 2 Benutzer gleichzeitig von zwei Computern angemeldet, Benutzer 1 den Wert als 100, dann User 2 setzt den Wert als 200 nach diesem Benutzer 1 ruft die Schaltfläche Wert abrufen auf. Was wird er als Wert sehen?

+0

See meine Frage/Antwort: https://stackoverflow.com/questions/12642136/asp-net-static-classes-and-asp-net-sessions – BlueChameleon

Antwort

57

Speichern statische Variablen ihre Werte über Benutzersitzungen hinweg?

Ja, deshalb sollten Sie SEHR vorsichtig sein, wenn Sie statische Variablen in einer Web-App verwenden. Sie werden in Concurrency-Problemen ausgeführt, da mehrere Threads, die eine Anfrage bearbeiten, den Wert der Variablen ändern können.

Während dies im Single-User-Umgebung arbeitet, Was passiert, wenn es 2 Benutzer gleichzeitig von zwei Computern angemeldet, Benutzer 1 den Wert als 100, dann User 2 setzt den Wert als 200 danach Benutzer 1 ruft die Schaltfläche Wert abrufen auf. Was wird er als Wert sehen?

Der Benutzer wird danach 200 sehen.

19

Statische Variablen Scope ist Application Level.

Wenn Sie etwas in statischen Variablen speichern, dann tun Sie die falsche Sache.

Wenn ein Benutzer die Daten speichert, wird zur gleichen Zeit ein anderer Benutzer auf die gleiche Seite zugreifen, dann erhält er auch die gleichen Daten. Also besser können Sie die Werte in Sessions speichern.

+0

können Sitzungsvariablen konfiguriert werden, um Speicher zu verwenden? Ich habe eine Situation, in der ein api Verbraucher keine Plätzchen speichert oder zurückkämmt, und ich will nicht, dass ein Datenbanktreffer, sein für etwas mehrmals pro Sekunde geschieht. –

1

Dies würde für Sie arbeiten (im Auge behalten, müssen Sie Nullwerte/-1 zu handhaben): für die Eigenschaft

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

Sie können auf die Sitzungsvariablen nicht direkt als "Sitzung" von einem statischen get- oder set-Accessor zugreifen. Sie müssen stattdessen HttpContext.Current.Session verwenden. –

+0

@StanShaw +1 .... –

-1

nicht statisch verwenden dann funktioniert es:

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