Il est nécessaire de conserver les informations d'état des pages Web et de leurs contrôles. Cependant, étant donné que les applications Web sont construites sur le protocole HTTP, qui est un protocole sans état, la maintenance des informations d'état devient très difficile. Afin de résoudre ce problème, la technologie ASP.NET 2.0 propose diverses solutions, telles que l'utilisation de Session, Cookie, état d'affichage, état de contrôle, champs cachés, chaînes de requête, configuration utilisateur personnalisée (Profil), etc. Pour utiliser la technologie ASP.NET 2.0 pour créer des contrôles serveur, la conservation des informations d'état est également très importante. La solution principale consiste à utiliser l'état d'affichage et l'état de contrôle. Cet article explique en détail les connaissances de base de l'état d'affichage (ViewState) et présente la méthode d'application de l'état d'affichage à travers des applications typiques.
Présentation de l'état d'affichage
L'état d'affichage est une technologie très importante qui permet à la page et aux contrôles de la page de conserver les informations d'état pendant l'aller-retour du serveur au client et retour du client. De cette manière, un effet de page avec état et exécuté en continu peut être créé au-dessus d'un environnement sans état comme le Web. Cette section présente principalement le mécanisme de fonctionnement, les méthodes d'application, les types de données stockées, les performances et la sécurité, le blocage de l'état d'affichage (il s'agit d'une nouvelle fonctionnalité d'ASP.NET 2.0), les avantages et les inconvénients de l'état d'affichage.
(1)
Le processus d'exécution spécifique de l'état d'affichage du mécanisme en cours d'exécution est le suivant : chaque fois que l'utilisateur demande une page .aspx, le framework .NET sérialise d'abord les données d'état des contrôles associés dans une chaîne, puis en fait un fichier nommé __VIEWSTATE La valeur Value du champ masqué est envoyée au client. Si la page est demandée pour la première fois, alors le contrôle serveur sera également exécuté pour la première fois. Le champ caché nommé __VIEWSTATE ne contient que les informations par défaut du contrôle, qui sont généralement vides ou nulles. Lors de l'événement de publication suivant, l'état de la propriété du contrôle serveur disponible lors de la publication précédente est enregistré dans ViewState. Cela permet au contrôle serveur de surveiller l'état avant que l'événement de publication actuellement géré ne se produise. Ces processus sont pris en charge par le framework .NET, et pour les utilisateurs, l'exécution de la page .aspx aura pour effet une exécution continue.
(2) Types de données stockées
L'état d'affichage peut stocker plusieurs types de données et, afin d'améliorer l'efficacité opérationnelle, l'état d'affichage lui-même comprend également un ensemble de méthodes de sérialisation optimisées pour les types courants. Les types de données pris en charge par défaut par la méthode de sérialisation de l'état d'affichage sont les suivants : String, Int32, Unit, Color, Array, ArrayList, HashTable et le convertisseur de type personnalisé TypeConverter.
L'état d'affichage a été optimisé pour les objets Array, ArrayList et HashTable contenant les types répertoriés ci-dessus. Par conséquent, lorsque vous utilisez l’état d’affichage dans les contrôles, vous devez essayer de limiter votre utilisation aux types de données simples ci-dessus, ainsi qu’aux types optimisés. Ici, nous devons nous concentrer sur le convertisseur de type personnalisé TypeConverter, qui fournit une méthode unifiée pour convertir le type de valeur en d'autres types et accéder aux valeurs standard et aux sous-propriétés. Par exemple, vous pouvez utiliser TypeConverter pour convertir une chaîne en valeur numérique ou une valeur numérique en chaîne. S'il n'y a pas de convertisseur de type, le framework de page utilisera la fonction de sérialisation binaire fournie par le framework .NET pour sérialiser l'objet. Ce processus est très gourmand en ressources.
(3) Performances et sécurité
Lors de l'utilisation de l'état d'affichage, les objets doivent d'abord être sérialisés, puis désérialisés via la publication. Nous devons donc savoir quelque chose sur les performances de ViewState. Par défaut, le ViewState du contrôle sera activé. Si vous n'avez pas besoin d'utiliser ViewState, il est préférable de le désactiver. ViewState ne sera plus nécessaire dans les situations suivantes : (1) Le contrôle ne définit pas d'événements côté serveur (les événements de contrôle à ce stade sont tous des événements côté client et ne participent pas à la publication) ; aucune valeur de propriété dynamique ou liée aux données. La façon de désactiver l’état d’affichage consiste à définir la valeur EnableViewState du contrôle sur « false », c’est-à-dire EnableViewState="false".
Par défaut, lorsque le contenu lié à l'état d'affichage est compilé et envoyé au client, le lecteur verra le contenu du champ caché __VIEWSTATE dans le code HTML de la page. Ce sont des chaînes dénuées de sens et sont le résultat du framework .NET codant le contenu pertinent via le codage Base64. Ils sont échangés entre le client et le serveur en texte clair. Dans certains cas, par exemple lorsque du contenu sensible tel que des mots de passe, des comptes, des chaînes de connexion, etc. est impliqué, il est très dangereux d'utiliser la méthode par défaut. À cette fin, le framework .NET fournit deux mécanismes de sécurité pour ViewState :
Mécanisme de vérification :
vous pouvez demander au framework .NET d'ajouter un code de hachage aux données ViewState en définissant l'attribut EnableViewStateMAC="true" (le code de hachage est un A Type SHA1 d'une longueur de 160 bits, cela affectera donc sérieusement les performances d'exécution). Lorsqu'un événement de publication se produit, le code de hachage sera rétabli et doit correspondre au code de hachage d'origine. De cette manière, il est possible de vérifier efficacement si le ViewState peut être falsifié pendant le processus de transmission. Par défaut, le .NET Framework utilise l'algorithme SHA1 pour générer des codes de hachage ViewState. De plus, vous pouvez également sélectionner l'algorithme MD5 en définissant
· Le mécanisme de cryptage
utilise le cryptage pour protéger les valeurs réelles des données dans les champs ViewState. Tout d’abord, EnableViewStatMAC="true" doit être défini comme décrit ci-dessus. Ensuite, définissez le type de validation machineKey sur 3DES, c'est-à-dire
(4) Blocage de l'état d'affichage
Le contenu ci-dessus introduit quelques connaissances de base sur l'état d'affichage. Cependant, certains lecteurs peuvent être confus : que se passe-t-il si les données d'état d'affichage deviennent très volumineuses dans certains cas ? Cela aura évidemment des conséquences inattendues. À cette fin, ASP.NET 2.0 ajoute une nouvelle fonctionnalité appelée « blocage de l'état d'affichage ». Si la quantité de données dans l'état d'affichage devient trop importante, la segmentation de l'état d'affichage divise automatiquement les données en plusieurs morceaux et place les données dans plusieurs champs de formulaire masqués.
Pour activer la segmentation de l'état d'affichage, définissez la propriété MaxPageStateFieldLength sur la taille maximale autorisée dans un seul champ d'état d'affichage, en octets. Lorsque la page est renvoyée sur le serveur, elle analyse la chaîne d'état d'affichage pendant la phase d'initialisation de la page et restaure les informations de propriété dans la page. Le paramètre par défaut est -1, ce qui signifie qu'il n'y a pas de taille maximale et que l'état d'affichage ne sera pas divisé en morceaux.
(5) Avantages et inconvénients
L'utilisation de l'état d'affichage présente les trois avantages suivants : 1. Elle consomme moins de ressources du serveur (par rapport à l'application et à la session). Parce que les données d’état d’affichage sont écrites sur l’ordinateur client. 2. Facile à entretenir. Par défaut, le système .NET active automatiquement la maintenance des données d'état de contrôle. 3. Fonctionnalités de sécurité améliorées. Les valeurs dans l'état d'affichage sont hachées, compressées et codées selon l'implémentation Unicode, qui est plus sécurisée que l'utilisation de champs masqués.
L'utilisation de l'état d'affichage présente les trois inconvénients suivants : 1. Considérations relatives aux performances. Étant donné que l'état d'affichage est stocké dans la page elle-même, si une valeur élevée est stockée, l'utilisateur peut toujours être ralenti lors de l'affichage et de l'envoi de la page, même si l'état d'affichage est fragmenté. 2. Limites de l'équipement. Les appareils mobiles peuvent ne pas disposer d'une capacité de mémoire suffisante pour stocker de grandes quantités de données d'état d'affichage. Par conséquent, lors du déplacement des contrôles serveur sur un appareil, une méthode d’implémentation différente est utilisée. 3. Risques potentiels pour la sécurité. L'état d'affichage est stocké dans un ou plusieurs champs masqués de la page. Bien que l'état d'affichage stocke les données dans un format haché, elles peuvent être falsifiées. Si vous affichez directement la source de sortie de la page, vous pouvez voir des informations dans des champs masqués, ce qui entraîne des problèmes de sécurité potentiels.
Applications typiques
Dans le processus de développement de contrôles serveur à l’aide de la technologie ASP.NET 2.0, l’état d’affichage peut être utilisé dans de nombreux aspects. Il est courant d'utiliser le dictionnaire ViewState pour implémenter les propriétés de contrôle du serveur. ViewState est de type System.Web.UI.StateBag - un dictionnaire de paires clé/valeur dans lequel les valeurs des propriétés de contrôle du serveur peuvent être stockées. Ce qui suit utilise un exemple typique pour illustrer la méthode d’application de ViewState.
Dans le contrôle serveur personnalisé LabelInViewState, deux propriétés Text et TextInViewState sont implémentées. Le premier est créé à l’aide de variables privées et le second est implémenté à l’aide de ViewState. Ils sont tous utilisés pour obtenir ou définir du contenu textuel. Le code source du fichier d'implémentation de contrôle personnalisé LabelInViewState.cs est le suivant.
en utilisant System; en utilisant System.Collections.Generic; en utilisant System.ComponentModel; en utilisant System.Text; en utilisant System.Web ; en utilisant System.Web.UI ; en utilisant System.Web.UI.WebControls;espace de noms WebControlLibrary{ [Propriété par défaut("Texte")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] classe publique LabelInViewState : WebControl { private string _text; // Implémente l'attribut Text public string Text { obtenir { return (_text == null) ? string.Empty : _text; } définir { _text = valeur } } //Utilisez ViewState pour implémenter la chaîne publique de la propriété TextInViewState TextInViewState { obtenir { Chaîne s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty : s); } set { ViewState["TextInViewState"] = valeur } } // Remplace la méthode RenderContents protected override void RenderContents (sortie HtmlTextWriter) { sortie.Write("Texte = "); sortie.Write(Texte); sortie.Write(" "); sortie.Write("TextInViewState = "); sortie.Write(TextInViewState); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <script runat="serveur"> void Button1_Click (expéditeur de l'objet, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </script> <head runat="serveur"> </tête> <body style="font-size: small;"> <form id="form1" runat="server"> <div> Nom : |
Le code ci-dessus affiché sur la page comprend deux zones de texte, deux boutons et un contrôle serveur personnalisé LabelInViewState. Comme indiqué dans le gestionnaire d'événements Button1_Click, lorsque vous cliquez sur le bouton « Soumettre », le contrôle LabelInViewState obtiendra le texte dans la zone de texte et l'affichera. Les rendus d'application sont présentés dans les figures 1 et 2.
Figure 1 Cliquez sur le bouton Soumettre | Figure 2 Cliquez sur le bouton de rechargement |