2011-03-07 4 views
9

Puis-je utiliser des variables statiques dans mon application Web? Quelles sont les alternatives à la statique? Lorsque j'utilise des variables statiques dans des pages et que plusieurs utilisateurs utilisent l'application, cela crée des données de conflit (données incorrectes).Variables statiques dans les applications Web

Quelles sont les limites d'utilisation des membres statiques?

Les membres statiques sont-ils partagés en mémoire?

Répondre

16

Envisagez de stocker vos variables partagées dans l'objet HttpApplication ou dans l'objet Cache. Toutefois, si vous essayez de stocker des valeurs pour chaque utilisateur séparément, vous devez stocker ces valeurs dans une variable de session.

Les variables statiques à l'intérieur de Asp.Net sont partagées dans l'espace mémoire du processus w3svc.exe et ne sont PAS sécurisées pour les threads. Ils peuvent être consultés et modifiés par n'importe quel utilisateur de l'application. Cela pourrait entraîner des modifications indésirables, sauf si vous écrivez votre propre mécanisme de verrouillage autour du stockage de ces valeurs.

Vous devriez essayer une syntaxe comme:

Application["KEY"] = value; 

pour stocker des données partagées à l'échelle application et

Session["KEY"] = value; 

pour stocker des données sur une base par utilisateur

Vous pouvez utiliser la Objet WebCache pour stocker des données dans la mémoire du serveur Web avec des conditions d'expiration. Syntaxe pour qui ressemble à:

Page.Cache.Insert("KEY", "VALUE", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); 

En savoir plus sur la syntaxe de la gestion de l'objet WebCache peut être trouvé à:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

+0

merci beaucoup

+1

Dans Asp.Net, ma préférence est de ne pas utiliser de variable statique pour les points de données partagés. Je préférerais utiliser l'objet Cache (éditer bientôt pour montrer l'exemple de syntaxe) afin que je puisse contrôler la durée de vie de mes points de données partagés. –

+1

La session est la solution la plus simple pour stocker les valeurs par utilisateur.Si vous stockez des objets volumineux (pensez aux jeux de données), votre performance se dégradera. Remarque: La session peut être stockée dans Asp.Net State Server ou le serveur SQL sur une machine étrangère, ce qui vous permet de gérer ces points de données spécifiques à l'utilisateur sur des serveurs Web dans un environnement webfarm –

2

Juste pour ajouter à ce que Fritz a dit @ Jeff, un IIS applic ation crée un AppDomain dans lequel vos assemblys sont chargés. Tout comme les règles d'une application de fenêtres normales, si une classe telle que

public static class Something 
{ 
    public static string SomeString { get; set; } 
} 

... alors qu'un seul Something.SomeString propriété est disponible par AppDomain. Le processus W3SVC gère l'AppDomain, mais ce n'est pas un garant de la sécurité des threads (car un AppDomain peut traiter plusieurs requêtes). Si vous utilisez des propriétés statiques en lecture seule, c'est probablement correct (comme lire des valeurs de configuration). Si vous modifiez des propriétés modifiables pendant la durée de vie d'une requête, il est préférable d'utiliser l'un des mécanismes de stockage détaillés dans d'autres questions ici.

Questions connexes