2009-10-13 13 views
20

Heute habe ich eine kleine ASP.net Beta-Webanwendung veröffentlicht, die es internen Mitarbeitern erlaubt, einige Produktinformationen zu ändern. Wir begannen damit, auf Probleme zu stoßen, bei denen Benutzer die Produktinformationen ihrer jeweils anderen Seite überschrieben haben ... obwohl jeder Mitarbeiter eine völlig andere Zeile (Produkt) bearbeitet hat.ASP.NET C# Statische Variablen sind global?

Nach einiger Suche auf Google, ich glaube, ich weiß, was los ist, sein mit der Verwendung von statischen Variablen zu tun, ist unten ein schnelles grobes Beispiel für das Problem:

// EditProductGroup.aspx.cs 
public partial class EditProductGroup : System.Web.UI.Page 
{ 

    private static int _groupId = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _groupId = Convert.ToInt16(Request.QueryString["GroupID"]); 

    // get existing ProductGroup information from database using 
    //_groupId to find the row and populate textboxes 
    } 

    private void saveProductGroupData() 
    { 
     // when user hits 'save changes' button, update row 
     //where the primary key column 'ProductGroupID' matches _groupId in the table 
    } 
} 

also nach Meine Forschung, eine statische Variable existiert tatsächlich für die Anwendung als Ganzes, das heißt, wenn mehrere Benutzer die Anwendung verwenden, werden sie alle den gleichen 'Wert' für '_groupId' lesen und in einigen Fällen sogar auf einen anderen Wert setzen Wert, der bewirkt, dass die Instanz eines anderen Benutzers der Seite Daten in der falschen Zeile speichert (ProductGroupId).

Meine Absicht war, dass die statische Variable von anderen Benutzern isoliert ist und nicht interferieren sollte - jeder Benutzer hat seine eigene Instanz der Seite, also ihre eigene Instanz der Variable '_groupId'.

Zum Glück wurde alles auf einer Dev/Staging-Datenbank statt der Live-db. Ich bin mir nicht sicher, ob ich nur das 'statische' Schlüsselwort ablegen muss, um zu verhindern, dass die Variable von allen gesetzt/gelesen wird.

Irgendwelche Gedanken? Danke

Antwort

22

Ja, in ASP.NET ist eine Lebensdauer von statischen Feldern für die App-Domäne (beachten Sie, dass dies ein wenig für generische Typen abweicht).

Ich würde empfehlen, die Server-Sitzung für die Speicherung von Daten zu verwenden, die Sie mit einer Instanz einer Client-Browser-Sitzung verknüpfen möchten (Benutzeranmeldung). dh

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]); 

Sie es, indem Sie abrufen können:

short groupID = Convert.ToInt16(Session["_groupID"]); 
+0

Dank Adam .... die einzige Sache ist, ich brauche es nicht wirklich für andere Seiten zu speichern, ich würde nur den Inhalt von 'Request speichern wollen.QueryString ["GroupID"] 'in eine Variable, die ich überall innerhalb nur dieser Seite verwenden kann ... ohne dass sie von' anderen 'Benutzerinstanzen der Seite geändert wird ... Würde "private _groupId" (das statische Schlüsselwort auslassen) erlauben dafür? Wenn nicht, dann könnte ich Sessions verwenden. Danke für die Eingabe! – Dal

+1

Dal - Sitzungsvariablen werden, wie Sie vermuten, unabhängig von der Seite, die für die gesamte Client-Browsersitzung angezeigt wird, beibehalten (sofern Sie sie nicht manuell ablaufen lassen). Sie können ViewState verwenden, um den Wert zu speichern, jedoch wird er an den Client gestreamt (mit seinen Standardeinstellungen), so dass es eine Chance gibt, mit der er mucked werden könnte (wie unwahrscheinlich). ViewState würde den Wert pro Seite beibehalten. Gibt es einen Grund, warum Sie den QueryString-Wert, den Sie anfangs verwenden, nicht weiter verwenden können? Für Ihre Situation würde ich QueryString, ViewState, HiddenField oder Session zum Speichern empfehlen. –

+1

Danke für die schnelle Antwort. Die Anwendung wurde modifiziert, um den Querystring direkt zu verwenden, anstatt ihn in eine Variable zu schieben, also denke ich, dass ich diese Methode weiterhin verwenden werde (QueryString). Ich war nur neugierig, ob meine ursprüngliche Implementierung immer noch ohne das statische Schlüsselwort funktionieren würde. Danke vielmals! :) – Dal

2

Statische Variablen hat die gleiche Lebensdauer wie eine Anwendungsdomäne sie erstellt wurden Also, wenn Sie einige falsche Werte bekommen es einige Probleme sein kann. in der Anwendungslogik oder sonst. Sie sollten SessionState für Benutzerdaten verwenden.

18

Es ist falsch zu sagen, dass eine statische Variable anwendungsweit existiert. Sie sind in der Tat gibt es auf zwei verschiedenen Ebenen

  1. Für nicht-generische Typen gibt es eine einzige statische Variable pro AppDomain
  2. Für generische Typen gibt es eine pro generic Instanziierung pro AppDomain

Eine Anwendung kann enthält viele Anwendungsdomänen und ist in verschiedenen Anwendungstypen gültig.

Wenn Sie jedoch benutzerspezifische Einstellungen speichern möchten, verwenden Sie eine Sitzungsvariable.