Vue d'ensemble de la gestion d'état ASP.NET

Mise à jour : novembre 2007

Une nouvelle instance de la classe de la page Web est créée chaque fois que la page est publiée au serveur. Dans la programmation Web ordinaire, cela signifierait généralement que toutes les informations associées à la page et à ses contrôles seraient perdues à chaque aller-retour. Par exemple, si l'utilisateur entre des informations dans une zone de texte, toutes ces informations sont perdues lors de l'aller-retour entre le navigateur ou le périphérique client et le serveur.

Pour contourner cette limitation inhérente de programmation Web traditionnelle, ASP.NET inclut plusieurs options qui permettent de conserver les données par page et dans l'application. Ces options sont les suivantes :

  • État d'affichage

  • État du contrôle

  • Champs masqués

  • Cookies

  • Chaînes de requête

  • État de l'application

  • État de session

  • Propriétés de profil

L'état d'affichage, l'état du contrôle, les champs masqués, les cookies et les chaînes de requête impliquent le stockage de données sur le client de diverses manières. Toutefois, l'état de l'application, l'état de session et les propriétés de profil stockent les données dans la mémoire du serveur. Chaque option présente des avantages et des inconvénients distincts, selon le scénario.

Options de gestion d'état client

Les sections suivantes décrivent les options de gestion d'état qui nécessitent de stocker les informations dans la page ou sur l'ordinateur client. Dans le cas de ces options, aucune information n'est conservée sur le serveur entre les allers et retours.

État d'affichage

La propriété ViewState fournit un objet dictionnaire pour conserver les valeurs entre plusieurs demandes d'une même page. Il s'agit de la méthode par défaut que la page utilise pour conserver les valeurs des propriétés des contrôles et de la page entre les allers-retours.

Lorsque la page est traitée, l'état actuel de la page et des contrôles est haché dans une chaîne, puis enregistré dans la page sous la forme d'un champ masqué ou de plusieurs champs masqués si la quantité de données stockées dans la propriété ViewState dépasse la valeur spécifiée dans la propriété MaxPageStateFieldLength. Lorsque la page est publiée sur le serveur, elle analyse la chaîne d'état d'affichage lors de l'initialisation de la page et restaure les informations sur les propriétés dans la page.

Vous pouvez également stocker des valeurs dans l'état d'affichage. Pour plus d'informations sur l'utilisation de l'état d'affichage, consultez Vue d'ensemble de l'état d'affichage ASP.NET. Pour des recommandations sur l'utilisation de l'état d'affichage, consultez Recommandations sur la gestion d'état ASP.NET.

État du contrôle

Vous devez stocker parfois les données d'état de contrôle pour qu'un contrôle puisse fonctionner correctement. Par exemple, si vous avez écrit un contrôle personnalisé dont les onglets affichent des informations différentes, celui-ci doit connaître l'onglet sélectionné entre les allers-retours pour qu'il puisse fonctionner comme prévu. La propriété ViewState peut être utilisée à cet effet, mais des développeurs peuvent désactiver l'état d'affichage au niveau de la page, ce qui arrête votre contrôle. Pour y remédier, l'infrastructure de la page ASP.NET expose une fonctionnalité dans ASP.NET appelée état du contrôle.

La propriété ControlState vous permet de faire persister des informations de propriété qui sont spécifiques à un contrôle et qui ne peuvent pas être désactivées comme la propriété ViewState.

Champs masqués

ASP.NET vous permet de stocker des informations dans un contrôle HiddenField, qui sont restituées sous forme de champ masqué HTML standard. Un champ masqué n'apparaît pas de façon visible dans le navigateur, mais vous pouvez définir ses propriétés de la même façon que pour un contrôle standard. Lorsqu'une page est envoyée au serveur, le contenu d'un champ masqué est envoyé dans la collection HTTP Form en même temps que les valeurs des autres contrôles. Un champ masqué se comporte comme un référentiel pour toute information propre à une page que vous souhaitez stocker directement dans la page.

Note de sécurité :

Un utilisateur malveillant peut très facilement afficher et modifier le contenu d'un champ masqué. Ne stockez jamais dans un champ masqué des informations sensibles ou des informations utilisées par votre application pour fonctionner correctement. Pour plus d'informations, consultez Recommandations sur la gestion d'état ASP.NET.

Un contrôle HiddenField stocke une variable unique dans sa propriété Value et doit être explicitement ajouté à la page. Pour plus d'informations, consultez Vue d'ensemble du contrôle serveur Web HiddenField.

Afin que les valeurs des champs masqués puissent être disponibles pendant le traitement de la page, vous devez envoyer la page à l'aide d'une commande HTTP POST. Si vous utilisez des champs masqués et qu'une page est traitée en réponse à un lien ou à une commande HTTP GET, les champs masqués ne seront pas disponibles. Pour obtenir des recommandations d'utilisation, consultez Recommandations sur la gestion d'état ASP.NET.

Cookies

Un cookie constitue une faible quantité de données stockées dans un fichier texte du système de fichiers du client ou dans la mémoire de la session du navigateur client. Il contient des informations propres au site que le serveur envoie au client en même temps que la sortie de page. Les cookies peuvent être temporaires (avec des dates et heures d'expiration spécifiques) ou persistants.

Vous pouvez les utiliser pour stocker des informations sur une application, une session ou un client particulier. Ils sont enregistrés sur le périphérique client et, lorsque le navigateur demande une page, le client envoie les informations dans le cookie avec les informations sur la demande. Le serveur peut lire le cookie et extraire sa valeur. Un exemple d'utilisation classique est le stockage d'un jeton (peut-être chiffré) indiquant que l'utilisateur a déjà été authentifié dans votre application.

Note de sécurité :

Le navigateur peut uniquement renvoyer les données au serveur ayant créé le cookie. Cependant, des utilisateurs malveillants disposent de moyens pour accéder aux cookies et lire leur contenu. Il est conseillé de ne pas stocker des informations sensibles, telles qu'un nom d'utilisateur ou un mot de passe, dans un cookie. À la place, stockez un jeton dans le cookie qui identifie l'utilisateur, puis utilisez ce jeton pour consulter les informations sensibles sur le serveur.

Pour plus d'informations sur l'utilisation des cookies, consultez Cookies et Recommandations sur la gestion d'état ASP.NET.

Chaînes de requête

Une chaîne de requête désigne des informations ajoutées à la fin de l'URL d'une page. Voici un exemple de chaîne de requête classique :

https://www.contoso.com/listwidgets.aspx?category=basic&price=100

Dans le chemin d'accès d'URL ci-dessus, la chaîne de requête commence par un point d'interrogation (?) et inclut deux paires attribut/valeur, l'une intitulée « category » et l'autre « price ».

Les chaînes de requête constituent un moyen simple, mais limité de conserver des informations d'état. Par exemple, ils offrent un moyen simple de passer des informations, comme un numéro de produit, d'une page à une autre page où elles seront traitées. Cependant, certains navigateurs et périphériques clients imposent une longueur maximale de 2083 caractères au nom d'une URL.

Note de sécurité :

Les informations transmises dans une chaîne de requête peuvent faire l'objet d'une falsification par un utilisateur malveillant. N'utilisez pas de chaînes de requête pour transmettre des données sensibles ou importantes. En outre, un utilisateur peut insérer un signet dans l'URL ou envoyer l'URL à d'autres utilisateurs, transmettant ainsi ces informations avec l'URL. Pour plus d'informations, consultez Recommandations sur la gestion d'état ASP.NET et Comment : se protéger contre les attaques de script dans une application Web en utilisant le codage HTML.

Afin que les valeurs des chaînes de requête puissent être disponibles pendant le traitement de la page, vous devez envoyer la page à l'aide d'une commande HTTP GET. Autrement dit, vous ne pouvez pas tirer parti d'une chaîne de requête si la page est traitée en réponse à une commande HTTP POST. Pour obtenir des recommandations d'utilisation, consultez Recommandations sur la gestion d'état ASP.NET.

Options de gestion d'état serveur

ASP.NET propose différentes solutions pour conserver les informations d'état sur le serveur au lieu des informations persistantes sur le client. La gestion d'état basée sur serveur permet de diminuer la quantité d'informations envoyées au client pour préserver l'état, mais elle peut utiliser des ressources coûteuses sur le serveur. Les sections suivantes décrivent trois fonctionnalités de gestion d'état basée sur serveur : état de l'application, état de session et propriétés de profil.

État de l'application

ASP.NET permet d'enregistrer des valeurs en utilisant l'état de l'application qui désigne une instance de la classe HttpApplicationState pour chaque application Web active. L'état de l'application est un mécanisme de stockage global qui est accessible à partir de toutes les pages de l'application Web. Il est donc utile pour stocker des informations qui doivent être maintenues entre les allers-retours et entre les demandes de pages. Pour plus d'informations, consultez Vue d'ensemble de l'état de l'application ASP.NET.

L'état de l'application est stocké dans un dictionnaire de type clé/valeur créé lors de chaque demande adressée à une URL donnée. Vous pouvez ajouter à cette structure des informations propres à votre application pour les stocker entre deux demandes de page.

Une fois que vous avez ajouté les informations propres à votre application à l'état de l'application, le serveur les gère. Pour obtenir des recommandations d'utilisation, consultez Recommandations sur la gestion d'état ASP.NET.

État de session

ASP.NET permet d'enregistrer des valeurs en utilisant l'état de session qui désigne une instance de la classe HttpSessionState pour chaque session d'application Web active. Pour une vue d'ensemble, consultez Vue d'ensemble de l'état de session ASP.NET.

L'état de session ressemble à l'état de l'application, sauf que sa portée est définie au niveau de la session du navigateur en cours. Si plusieurs utilisateurs utilisent votre application, chaque session d'utilisateur présente un état de session différent. En outre, si un utilisateur quitte votre application pour y revenir ultérieurement, la deuxième session d'utilisateur présentera un état de session différent du premier.

L'état de session a une structure du dictionnaire de type clé/valeur permettant de stocker les informations propres à la session devant être conservées entre les allers-retours et entre les demandes de pages. Pour plus d'informations, consultez Vue d'ensemble de l'état de session ASP.NET.

Vous pouvez utiliser l'état de session pour accomplir les tâches suivantes :

  • Identifier de façon unique les demandes du navigateur ou du périphérique client et les faire correspondre à une instance de session sur le serveur.

  • Stocker les données propres à la session sur le serveur afin de pouvoir les utiliser pour les différentes demandes du navigateur ou du périphérique émises pendant une même session.

  • Déclencher les événements de gestion de session appropriés. Vous pouvez, en outre, écrire le code d'application qui met à niveau ces événements.

Une fois que vous avez ajouté les informations propres à votre application à l'état de session, le serveur gère cet objet. En fonction des options spécifiées, les informations sur la session peuvent être stockées dans des cookies, sur un serveur out-of-process ou sur un ordinateur exécutant Microsoft SQL Server. Pour obtenir des recommandations d'utilisation, consultez Recommandations sur la gestion d'état ASP.NET.

Propriétés de profil

ASP.NET fournit une fonctionnalité appelée Propriétés de profil qui permet de stocker des données propres à l'utilisateur. Cette fonctionnalité est identique à l'état de session, mais les données de profil ne sont pas perdues à l'expiration de la session d'un utilisateur. Elle utilise un profil ASP.NET qui est stocké dans un format persistant et associé à un utilisateur individuel. Le profil ASP.NET vous permet de gérer facilement les informations utilisateur sans qu'il soit nécessaire de créer et de gérer votre propre base de données. De plus, le profil met les informations utilisateur à votre disposition à l'aide d'une interface API fortement typée à laquelle vous pouvez accéder à partir de n'importe quel endroit de votre application. Vous pouvez stocker des objets de tout type dans le profil. La fonctionnalité de profil ASP.NET fournit un système de stockage générique qui vous permet de définir et de maintenir la majeure partie des types de données, tout en rendant les données disponibles d'une manière sécurisée au niveau du type.

Pour utiliser les propriétés de profil, vous devez configurer un fournisseur de profils. ASP.NET inclut une classe SqlProfileProvider qui vous permet de stocker les données de profil dans une base de données SQL, mais vous pouvez créer également votre propre classe de fournisseur de profils qui stocke les données de profil dans un format personnalisé et dans un mécanisme de stockage personnalisé tel qu'un fichier XML, ou même dans un service Web.

Étant donné que les données enregistrées dans les propriétés de profil ne sont pas stockées dans la mémoire de l'application, elles sont conservées durant les redémarrages des services IIS (Internet Information Services) et du processus de traitement. En outre, les propriétés de profil peuvent être rendues persistantes sur plusieurs processus, par exemple dans une batterie de serveurs Web ou un jardin Web. Pour plus d'informations, consultez Vue d'ensemble des propriétés du profil ASP.NET.

Voir aussi

Concepts

Recommandations sur la gestion d'état ASP.NET

Vue d'ensemble des cookies ASP.NET

Vue d'ensemble de l'état d'affichage ASP.NET

Vue d'ensemble de l'état de session ASP.NET

Vue d'ensemble de l'état de l'application ASP.NET

Vue d'ensemble des propriétés du profil ASP.NET