Comprendre l'état de la session asp.net
Auteur:Eve Cole
Date de mise à jour:2009-07-01 16:44:49
1. Fonctions de l'état de session
HTTP est un protocole sans état, il n'indique donc pas automatiquement si une séquence de requêtes provient toutes du même client, ni même si une seule instance de navigateur consulte toujours activement une page ou un site. Et en utilisant la fonction d'état de session intégrée d'ASP.net, nous pouvons utiliser
1. Identifiez et classez automatiquement les demandes d'un seul client de navigateur vers une session d'application logique sur le serveur.
2. Stockez les données de session sur le serveur pour les utiliser sur plusieurs requêtes de navigateur.
3. Déclenchez des événements de gestion de durée de vie de session appropriés (Session_OnStart, Session_OnEnd, etc.) qui peuvent être gérés dans le code de l'application.
2. Identification de l'état de la session
Lors de la création d'une session, le serveur génère un identifiant distinct pour chaque session. L'identifiant est représenté par une chaîne SessionID de 120 bits qui contient uniquement les caractères ASCII autorisés dans l'URL. La valeur SessionID est générée à l'aide d'un algorithme qui garantit l'unicité et le caractère aléatoire. Le but de garantir l'unicité est de garantir que les sessions n'entrent pas en conflit, et le but de garantir le caractère aléatoire est de garantir que les utilisateurs malveillants ne peuvent pas utiliser de nouveaux SessionID pour calculer le nombre de SessionID existants. sessions.
3. Comment stocker l'état de la session
Il existe trois manières de stocker l'état d'une session :
1. Mode état de session en cours (Inproc) : Lorsque nous créons un nouveau programme Web, le mode état de session en cours est adopté par défaut. C'est aussi le mode couramment utilisé par tout le monde. Dans ce mode, l'état de session est stocké localement dans le processus de travail ASP.NET, donc le mode d'état de session en cours est probablement l'option d'accès la plus rapide. Mais plus il y a de données stockées dans une session, plus le serveur Web consomme de la mémoire, ce qui augmente potentiellement le risque de dégradation des performances.
2. Mode serveur d'état .NET (StateServer) : l'état de la session est stocké dans le processus distant (par exemple, dans le service Windows NT nommé aspnet_state.exe)
3. Mode SQL (SQLServer) : l'état de la session est stocké dans une table de base de données dédiée gérée par SQL Server.
Le mode serveur d'état .NET et le mode SQL peuvent être appelés mode de session hors processus, lors du stockage des données, les données doivent être sérialisées et stockées dans un référentiel externe. Lors de la lecture et des données, les données doivent être désérialisées et copiées. au dictionnaire de session local, la requête a donc entraîné une dégradation des performances de 15 % (hors processus) à 25 % (SQL Server). Notez qu’il ne s’agit que d’une estimation approximative. Mais dans le scénario de stockage hors processus, l'état de session survit plus longtemps, ce qui rend l'application plus puissante car elle protège contre les pannes de Microsoft® Internet Information Services (IIS) et d'ASP.NET. En séparant l'état de session des applications, vous pouvez également étendre plus facilement les applications existantes dans les architectures Web Farm et Web Garden. De plus, l'état de la session est stocké dans un processus externe, éliminant ainsi le risque de perte de données périodique due aux boucles de processus.
4. Configuration de l'état de la session
La configuration de l'état de session est réalisée en définissant la section <sessionState> du fichier Web.config. Ce qui suit présente les méthodes de configuration spécifiques des trois états de session.
1. Mode en cours
Le mode En cours est le mode d'état de session par défaut. Pour utiliser le mode en cours, définissez l'attribut mode de l'élément <sessionState> sur Inproc.
Un exemple de paramètre de configuration pour le mode en cours est présenté ci-dessous. http://www.downcodes.com
<configuration>
<système.web>
<sessionState mode="Inproc"
sans cookie = "faux"
délai d'attente="20"/>
</étatdesession>
</system.web>
</configuration>
2. Mode serveur d'état
Pour utiliser un serveur d'état, vous devez d'abord vous assurer que le service d'état ASP.NET est exécuté sur le serveur distant utilisé pour le stockage de session. Ce service est installé avec ASP.NET et Visual Studio .NET à l'adresse :
racine systèmeMicrosoft.NETFrameworkversionNumberaspnet_state.exe
Ensuite, dans le fichier Web.config de l'application, définissez l'attribut mode de l'élément <sessionState> sur StateServer. Enfin, définissez la propriété connectionString sur tcpip=serverName:portNumber.
Voici un exemple de paramètres de configuration pour le mode serveur d'état.
<configuration>
<système.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=dataserver:42424"
sans cookie = "faux"
délai d'attente="20"/>
</étatdesession>
</system.web>
3. Mode serveur SQL
Pour utiliser SQL Server, exécutez d'abord InstallSqlState.sql ou InstallPersistSqlState.sql sur l'ordinateur SQL Server sur lequel l'état de session sera stocké. Les deux scripts créent une base de données nommée ASPState, qui contient plusieurs procédures stockées.
La différence entre les deux scripts réside dans l'emplacement où sont placées les tables ASPStateTempApplications et ASPStateTempSessions. Le script InstallSqlState.sql ajoute ces tables à la base de données TempDB, qui perdra des données au redémarrage de l'ordinateur. Au lieu de cela, le script InstallPersistSqlState.sql ajoute ces tables à la base de données ASPState, ce qui permet de conserver les données de session lors des redémarrages de l'ordinateur.
Par défaut, les deux fichiers de script sont installés à l'emplacement suivant :
racine systèmeMicrosoft.NETFrameworkversionNumber
Ensuite, dans le fichier Web.config de l'application, définissez l'attribut mode de l'élément <sessionState> sur SQLServer. Enfin, définissez la propriété sqlConnectionString sur Integrated Security=SSPI;data source=serverName;.
Un exemple de paramètre de configuration pour le mode SQL Server est présenté ci-dessous.
<configuration>
<système.web>
<sessionState mode="SQLServer"
sqlConnectionString="Sécurité intégrée=SSPI;source de données=serveur de données;"
sans cookie = "faux"
délai d'attente="20"/>
</étatdesession>
</system.web>
</configuration>
En mode SQL Server, l'état de la session peut également être configuré pour fonctionner dans un cluster de basculement. Un cluster de basculement est constitué d'au moins deux serveurs Web redondants identiques qui stockent les données de session dans une base de données SQL Server sur un ordinateur distinct. Si un serveur Web tombe en panne, un autre serveur du cluster prend en charge son travail et répond aux requêtes sans perdre les données de session.
Pour configurer le clustering de basculement, définissez l'élément <machinekey> dans le fichier Web.config du serveur Web sur la même valeur.
Définissez ensuite la chaîne de connexion SQL du serveur Web pour qu'elle pointe vers la base de données SQL Server sur votre ordinateur où les données de session sont stockées.
5. Accès à l'état de la session
Vous pouvez accéder à l'état de la session directement via la collection Session. Pour des raisons de compatibilité avec les versions antérieures d'ASP, l'accès à l'état de session peut également être obtenu via la propriété Session.Contents sur l'objet application.
L'exemple suivant montre l'écriture de deux valeurs dans la collection Session sur la première page Web, puis la lecture de la collection Session sur la deuxième page Web. Remarque : Les codes de page sont omis ici.
La première page Web écrit la valeur dans la collection Session
dim nom sous forme de chaîne = "a"
identifiant faible sous forme d'entier = "1"
session("nom") = nom
session("identifiant") = identifiant
La deuxième page Web obtient la valeur de la collection Session
dim nom as string = session("name")
dim id comme entier = session("id")
'Obtenir le nombre d'éléments dans la collection d'état de session
dim i comme entier = session.count
Notez qu'en mode en cours, aucune sérialisation ni désérialisation réelle ne se produisent, de sorte que les objets sont stockés dans l'état de session en tant qu'instances actives de leurs classes respectives.
En mode session hors processus, la sérialisation et la désérialisation étant utilisées, vous devez convertir le type de données en fonction de la situation.
Si vous sérialisez une valeur de date, la date doit être de type Int64.
6. Événements de gestion de la durée de vie de la session
Il existe deux événements de gestion de durée de vie de session, l'événement Session_OnStart et l'événement Session_OnEnd. Vous pouvez les définir dans le fichier Global.asax.VB.
1. Événement Session_OnStart
Lorsqu'un seul client navigateur se connecte au serveur, l'événement Session_OnStart est déclenché, ce qui marque le début de la session. Cet événement ne sera plus déclenché lors de la navigation ultérieure, sauf si la session expire ou est abandonnée. L'événement Session_OnStart est le meilleur moment pour définir les variables de session, car elles sont définies avant l'accès à une page.
Exemple : L'exemple suivant est un code d'événement Session_OnStart couramment utilisé pour compter le nombre de personnes en ligne :
Sub Session_Start (expéditeur ByVal en tant qu'objet, ByVal et en tant qu'EventArgs)
'Lorsqu'un événement se produit, ajoutez 1 au nombre d'utilisateurs en ligne
Application("nombre d'utilisateurs") = Application("nombre d'utilisateurs") + 1
Fin du sous-marin
2. Événement Session_OnEnd
L'événement Session_OnEnd se produit lorsqu'une session est abandonnée ou expire et marque la fin de l'événement. Mais veuillez noter que cet événement n'est pris en charge qu'en mode InProc. Vous pouvez spécifier le délai d'expiration via l'attribut timeout de la section <sessionState> du fichier Web.config si l'utilisateur est dans le délai d'expiration (en minutes, la valeur par défaut est de 20 minutes.
horloge) sans actualiser ni demander la page Web, la session sera terminée. Vous pouvez utiliser l'événement Session_OnEnd pour effectuer un travail de nettoyage.
Exemple : L'exemple suivant est un code d'événement Session_OnEnd couramment utilisé pour compter le nombre de personnes en ligne :
Sub Session_End (expéditeur ByVal en tant qu'objet, ByVal et en tant qu'EventArgs)
Application("nombre d'utilisateurs") = Application("nombre d'utilisateurs") - 1
Fin du sous-marin