Si vous avez l'habitude de visualiser le code source HTML de la page actuelle que vous parcourez dans IE, vous pouvez souvent voir des extraits de code similaires aux suivants :
<input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Si vous êtes intelligent, vous demanderez certainement : qu'est-ce que c'est ? Qu'est-ce que ça fait ? Quel est le rapport avec cet article ? Chers lecteurs, écoutez-moi lentement.
En fait, c'est la performance caractéristique de l'application MS de la technologie ViewState dans Asp.net. Pour que la page puisse toujours lire les données d'état d'origine du contrôle serveur après PostBack, Asp.net utilise la technologie ViewState, qui utilise essentiellement un champ de formulaire de type caché avec le nom par défaut « __VIEWSTATE » pour enregistrer et transférer les données. . (Ces données sont des valeurs de chaîne codées en Base64 sérialisées et sont enregistrées avant la sortie par la méthode Page.SavePageStateToPersistenceMedium et chargées par Page.LoadPageStateFromPersistenceMedium) Bien que nous puissions facilement désactiver l'aller-retour de ces données à travers trois niveaux Pass :
ensemble de niveaux de machine
.<pages activateViewStateMac='false' /> dans machine.config
Au niveau de l'application, définissez <pages activateViewStateMac='false' /> dans le fichier web.config de Web Applicin.
Au niveau d'une seule page, définissez < %@Page enableViewStateMac='false' %> dans la page ou définissez Page.EnableViewStateMac = false via le code ;
Cependant, si nous pouvons résoudre complètement le fardeau de la transmission de données en désactivant ViewState sans provoquer d'effets secondaires, alors les architectes MS ne seront pas assez stupides pour être si mignons (à quoi bon le laisser comme une chose superflue ?), parce que nous avons souvent Nous ne pouvons pas résoudre ce problème de charge de transmission en le désactivant simplement, nous ne pouvons trouver qu'un autre moyen pour réduire au maximum le volume de transmission dans le réseau aller-retour, la compression est donc devenue notre premier choix. Tant que nous surchargeons la méthode SavePageStateToPersistenceMedium() et la méthode LoadPageStateFromPersistenceMedium() de la classe Page, et compressons et décompressons les données dans la méthode surchargée. Les classes GZipInputStream et GZipOutputStream fournies par le projet open source SharpZipLib sont apparues à notre avis. Pour plus de commodité, nous pourrions aussi bien écrire une classe CompressionHelper avec le code suivant :
1using System.IO ;
2en utilisant ICSharpCode.SharpZipLib.GZip ;
3
4espace de noms Ycweb.Components
5{
6 /**//// <résumé>
7 /// Description récapitulative de CompressionHelper.
8 /// </summary>
9 CompressionHelper de classe publique
10 {
11 publicCompressionHelper()
12 {
13 //
14 // TODO : Ajouter la logique du constructeur ici
15 //
16}
17
18 /**//// <résumé>
19 /// Compresser les données
20 /// </summary>
21 /// <param name="data">Tableau d'octets à compresser</param>
22 /// <returns>Tableau d'octets compressé</returns>
23 octets statiques publics[] CompressByte (données octet[])
vingt-quatre {
25 MemoryStream ms = new MemoryStream();
26 Flux s=nouveau GZipOutputStream(ms);
27 s.Write(données, 0, données.Longueur);
28 s.Fermer();
29 return ms.ToArray();
30}
31
32 /**//// <résumé>
33 /// Décompresser les données
34 /// </summary>
35 /// <param name="data">Tableau d'octets à décompresser</param>
36 /// <returns>Tableau d'octets décompressé</returns>
37 octet statique public[] DeCompressByte (données octet[])
38 {
39 octets[] writeData = nouvel octet[2048];
40 MemoryStream ms= new MemoryStream( données );
41 Stream sm = new GZipInputStream(ms) as Stream ;
42 MemoryStream outStream = new MemoryStream();
43 tandis que (vrai)
44 {
45 int size = sm.Read(writeData,0, writeData.Length );
46 si (taille >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
50 autres
51 {
52 pause;
53}
54 }
55 sm.Close();
56 octets[] outArr = outStream.ToArray();
57 outStream.Close();
58 retour outArr;
59 }
60 }
61} Ensuite, nous surchargeons les méthodes LoadPageStateFromPersistenceMedium() et SavePageStateToPersistenceMedium(Object viewState) dans la classe de base du contrôle de page dérivée de la classe Page. Le code est le suivant :
1Charger et enregistrer les données ViewState#region Charger et enregistrer les données ViewState
2 objet de remplacement protégé LoadPageStateFromPersistenceMedium()
3 {
4//Lire les données du domaine caché __SmartViewState enregistré par vous-même
5 chaînes viewState = Request.Form["__SmartViewState"];
6 octets[] octets = Convert.FromBase64String(viewState);
7 //Appelez la méthode statique CompressionHelper.DeCompressByte() fournie ci-dessus pour décompresser les données
8 octets = CompressionHelper.DeCompressByte(octets);
9 Formateur LosFormatter = new LosFormatter();
10 return formateur.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 remplacement protégé void SavePageStateToPersistenceMedium (Object viewState)
15 {
16 Formateur LosFormatter = new LosFormatter();
17 StringWriter écrivain = new StringWriter();
18 formateur.Serialize(writer, viewState);
19 chaîne viewStateString =writer.ToString();
20 octets[] octets = Convert.FromBase64String(viewStateString);
21 //Appelez la méthode statique CompressionHelper.CompressByte() fournie ci-dessus pour compresser les données
22 octets = CompressionHelper.CompressByte(octets);
vingt-trois
24 //Enregistrez un nouveau champ caché __SmartViewState, vous pouvez également le définir vous-même
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#endrégion
Après le traitement ci-dessus, le code source dans la page de sortie Web ressemble à :
<input type="hidden" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" value="" />
Le champ caché d'origine "__VIEWSTATE" a une valeur vide et est remplacé par un nouveau champ caché "__SmartViewState" enregistré par nous-mêmes pour stocker la chaîne compressée. De cette façon, l'effet d'accélération est évident en combinaison avec notre projet. Par exemple, la valeur de chaîne ViewState d'origine de la page d'accueil de DG3G.COM est d'environ 28 Ko, et elle est de 7 Ko après compression, tandis que la valeur de chaîne ViewState d'origine de la page d'accueil d'Acafa.com est d'environ 43 Ko, et elle est de 8 Ko après compression. Ce type de traitement est tout à fait satisfaisant. Bien sûr, si vous estimez que ce n'est pas assez approfondi, vous pouvez également stocker la chaîne ViewState dans la Session. Cependant, si vous faites cela, la pression sur la mémoire du serveur augmentera fortement (surtout lorsque le nombre de visites est important). . Il est recommandé de ne pas l'utiliser à la légère. Si votre serveur Web dispose de 10 Go ou 8 Go de mémoire, autant l'essayer. Le code modifié correspondant est donné ci-dessous :
Modifiez le code dans le corps de la méthode LoadPageStateFromPersistenceMedium() ci-dessus :
chaîne viewState = Request.Form["__SmartViewState"];
Modifier pour :
string viewState = Session["__SmartViewState"].ToString();
En même temps, ajoutez le code dans le corps SavePageStateToPersistenceMedium() ci-dessus :
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
Modifier pour :
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Enfin, les codes et solutions ci-dessus proviennent tous de la pratique de développement de VS2003. Je ne promets pas si VS2005 est adapté. Cependant, si vous pouvez tirer quelque chose de ce qui précède. solutions, je serai extrêmement heureux.