Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...

News

Statische Variablen in ASP.NET

Ein Beispiel aus dem Alltag: Ich baue einen Teil einer Webanwendung, die etwas aus einer bestimmten fertigen Datenbank anzeigen soll. Dazu bekomme ich einen fertigen Business Layer, der alle Daten aufbereitet, Berechtigungen prüft, etc.

Ich habe den BL eingebaut, alles läuft, keine Fehler. Ich fange an zu testen.

Ich logge mich in die Anwendung ein und lasse mir die Daten ausgeben und bin zufrieden.
Ich logge mich anschließend mit einem neuen Browser und einem anderen User – mit weniger Berechtigungen – in die Anwendung ein und lasse mir abermals die Daten ausgeben, ich sehe alle Daten und bin ebenfalls zufrieden.
Ich logge mich nun mit einem User ein, der fast keine Berechtigungen hat und lasse mir die Daten ausgeben und bin nicht zufrieden, denn ich sehe die Daten, was nicht sein darf.

Nun schaue ich mir meine Arbeit noch mal an, finde keinen Fehler und starte die Anwendung neu.

Ich logge mich nun mit dem letzten Benutzer ein und möchte mir das Problem noch mal anschauen. Und siehe da… Ich bekomme keine Daten angezeigt, was richtig ist.

Ich nehme meinen zweitletzten User logge mich ein und sehe keine Daten?!?!

Ich logge mich mit meinen eigenen Zugang ein … und sehe keine Daten?!?!?!?!

Was passiert hier?

So langsam schöpfe ich Verdacht… es werden immer die Berechtigungen des Users verwendet, der sich als erste nach einem Neustart der Anwendung eingeloggt hat!

Die Berechtigungen werden vom BL in einer statischen Variablen zwischengespeichert, um nicht immer wieder neu ermittelt werden zu müssen. Da sich statische Variable im ASP.NET wie Application Variablen verhalten – ganz egal, ob diese sich in einer externen Library befinden oder im Webprojekt – sind diese immer und überall für alle User sichtbar.

Ein kleines Beispiel um das Problem nachzuvollziehen:

public class TestClass
{
  private static string sessionId;
  public static string getSessionId(string SessionId)
  {
    if (sessionId == null)
      sessionId = SessionId;
    return sessionId;
  }
}

Meine Testklasse mit den statischen Members

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    this.lblOwnSessionId.Text = Session.SessionID;
    this.lblStaticSessionID.Text = TestClass.getSessionId(Session.SessionID);
  }
}

Die CodeBehind meiner Test ASP.NET Seite.

Die angezeigten Session IDs unterscheiden die einzelnen User. Die erste Session ID ist die des aktuellen Benutzers, die zweite Session ID ist die, die in einer Statischen Variablen zwischengespeichert wird.

Ihr werdet sehen, dass die Zweite Session ID die des Users ist, der die Anwendung als erste Aufgerufen hat und sich nicht mehr ändert, bis die Application neu gestartet wird. Alle anderen User können diese Session ID sehen.

Hier noch die Anwendung zum selber testen:
hier downloaden

Posted: Donnerstag, 23. August 2007 08:56 von Jürgen Gutsch
Abgelegt unter: , ,

Kommentare

Peter Bucher sagte:

Dies ist die Fortsetzung der Artikelserie "ASP.NET Grundlagen" mit folgenden Teilen: ASP.NET Grundlagen

# September 14, 2008 23:23

Peter Bucher sagte:

Sally Jürgen

> Da sich statische Variable im ASP.NET wie Application Variablen verhalten – ganz egal, ob diese sich in einer externen Library befinden oder im Webprojekt

Ist dasselbe Verhalten wie bei Desktop-Apps, statische Members sind pro App(Domain) gültig.

Nur fällts dort nicht so sehr auf :)

# November 28, 2008 10:18

GENiALi sagte:

Da wird mir so einiges klar. Danke.

# Juni 17, 2009 16:26

Garry Cooper sagte:

Hi,

bist du sicher das dein Problem nicht daher resultiert das du alles lokal mit einem VirtualServer testest? Daraus resultieren unendliche viele Speicher-Probleme mit Codeschnipseln die noch in irgendwelchen Cache-Speichern rumgeistern; könnte man natürlich mit unendlich vielen Überprüfungen wegbekommen...

# August 21, 2009 13:22

Jürgen Gutsch sagte:

@Garry Cooper,

Da bin ich zu 100% sicher, denn ich verwende keine Virtual Server beim Entwicklen ;-)

Das Problem ist auf jedem Rechner nachvollziehbar und liegt definitiv und zu 100% an den statischen Feldern.

Also: Keine statischen Felder in Webanwendungen, bzw. Multiuseranwendungen benutzen!

# August 21, 2009 13:58
Anonyme Kommentare sind nicht zugelassen