2010-08-24 14 views
1

Je développe un site Web pour un client (ASP.NET, T-SQL). C'est un site Web de saisie de données permettant à plusieurs de leurs utilisateurs de se connecter et de manipuler des enregistrements dans la même base de données.ASP.NET 2 état de session entre les utilisateurs authentifiés

Il existe des instructions (essentiellement une liste de chaînes) dans le formulaire, indiquant aux utilisateurs ce qu'il faut faire pour chaque section; ces instructions sont elles-mêmes présentes dans la base de données.

À chaque connexion, je stocke ces instructions dans l'objet Session [] par utilisateur authentifié. Les instructions sont identiques pour tout le monde.

J'ai examiné une solution qui suggérait de stocker un identifiant de session commun dans la base de données, puis de l'interroger pour réutiliser cette session particulière, mais cela semble très hacky. Qu'est-ce qu'une solution de meilleures pratiques pour y parvenir? Y at-il un objet «commun» disponible pour tous les utilisateurs?

+0

Avez-vous considéré System.Web.HttpRuntime.Cache? - http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx –

+0

merci pour l'acceptation - juste par curiosité, quelle option avez-vous choisi à la fin? =) – Rob

+0

@Rob: Désolé, il a fallu si longtemps pour répondre, je n'ai pas remarqué votre message. J'ai fini par stocker les chaînes dans l'objet Session comme vous aviez raison - elles sont assez petites pour être insignifiantes. En outre, nous définissons le délai d'expiration des cookies à ~ 1h, et lors de la connexion/déconnexion, la session est effacée afin qu'ils reçoivent les instructions les plus récentes chaque jour lorsqu'ils travaillent. Merci de votre aide! – Alex

Répondre

4

Fi Premièrement, est-ce important à ce stade? Oui, c'est une mauvaise pratique et inefficace, mais si vous stockez 20 Ko de chaînes en mémoire et que vous avez un maximum de 100 utilisateurs, cela représente 2 000 Ko de données. A peine beaucoup de mémoire "gaspillée". Même à 200Ko de chaînes, c'est 20 000Kb de données. Encore une fois, pas beaucoup. Cela vaut-il votre temps, et le client vous attend pour le résoudre, maintenant?

Si vous décidez il est alors vous pouvez:

  1. Conserver les chaînes dans l'objet Application ou une classe statique afin qu'ils soient récupérés une fois et utilisé plusieurs fois. Récupère les chaînes sur chaque page. Cela peut ne pas être aussi dommageable que cela puisse paraître.
  2. Utilisez quelque chose comme Cache class dans System.Web.Caching. Utiliser le Output Caching.
  3. Utiliser Windows Server AppFabric "Velocity" memory cache.
2

Semble à moi comme si vous recherchez le cache d'application. Comme la session, il s'agit d'un cache de données en mémoire. Contrairement à la session, elle est partagée par tous les utilisateurs. chaque utilisateur n'a pas sa propre copie individuelle des données. En outre, lorsque vous ajoutez des éléments de données au cache, vous pouvez spécifier des critères qui invalideront automatiquement ces données et les rechargeront/rafraîchiront (utile lorsque les données qui changent rarement changent réellement).

Voici quelques articles qui devraient vous donner tout ce que vous devez savoir sur l'utilisation du cache de l'application (et d'autres options de mise en cache dans ASP.NET ainsi):

+0

Merci pour votre réponse, mais je ne pouvais en accepter qu'une:] – Alex

1

Je suggère d'utiliser l'objet Cache au niveau de l'application. Il est disponible partout dans le cadre de HttpContext. Vous pouvez le remplir sur App_Start.

Vous pouvez placer n'importe quel type d'objet dans le cache, mais évidemment, plus le plus petit est grand, mieux c'est.

Voici quelques exemples de la façon de le remplir en utilisant C#:

1) Ajouter des éléments à la cache que vous devez ajouter des éléments à un dictionnaire en spécifiant la valeur clé & de l'élément. Exemple: ajoutez la propriété Value actuelle d'une zone de texte au cache.

Cache["txt1"] = txtName.value; 

ou

Cache["result"] = dataset; 

2) La méthode Insert est surchargée, ce qui vous permet de définir des valeurs pour les paramètres de la version que vous utilisez. Exemple: ajout d'une seule clé d'élément & valeur:

Cache.Insert ("MyData1", connectionString);

3) La méthode Add a la même signature que la méthode Insert, mais renvoie un objet représentant l'élément que vous avez ajouté.

Cache.Add("MyData1", connectionString); 

Pour récupérer le cache de:

stringName = Cache["MyData"]; 

Si les données en cache est pas une chaîne, vous devrez peut-être jeter le type de données approprié.

result = (DataSet)Cache["result"]; 

L'un des avantages de l'utilisation de l'objet du cache, par opposition à l'objet d'application est que le CLR videra le contenu du cache si le système est en danger de manquer de mémoire.

+0

Merci pour votre réponse, mais je ne pouvais en accepter qu'une:] – Alex

Questions connexes