Wenn Sie die Angewohnheit haben, den HTML-Quellcode der aktuellen Seite, die Sie im IE durchsuchen, anzuzeigen, sehen Sie möglicherweise häufig Codeausschnitte ähnlich den folgenden:
<input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Wenn Sie schlau sind, werden Sie sich bestimmt fragen: Was ist das? Was macht es? In welcher Beziehung steht es zu diesem Artikel? Liebe Leserinnen und Leser, bitte hören Sie mir langsam zu.
Tatsächlich ist dies die charakteristische Leistung der MS-Anwendung der ViewState-Technologie in Asp.net. Damit die Seite nach PostBack weiterhin die ursprünglichen Statusdaten der Serversteuerung lesen kann, verwendet Asp.net die ViewState-Technologie, die im Wesentlichen ein Formularfeld vom Typ Hidden mit dem Standardnamen „__VIEWSTATE“ zum Speichern und Übertragen von Daten verwendet (Diese Daten sind serialisierte Base64-codierte Zeichenfolgenwerte und werden vor der Ausgabe von der Methode Page.SavePageStateToPersistenceMedium gespeichert und von Page.LoadPageStateFromPersistenceMedium geladen.) Obwohl wir den Roundtrip dieser Daten über drei Ebenen einfach deaktivieren können:
Maschinenebene eingestellt <pages enableViewStateMac='false' /> in machine.config
Legen Sie auf Anwendungsebene <pages enableViewStateMac='false' /> in der web.config von Web Applicin fest
Legen Sie auf der Einzelseitenebene < %@Page enableViewStateMac='false' %> auf der Seite fest oder legen Sie Page.EnableViewStateMac = false über den Code fest;
Wenn wir jedoch die Datenübertragungslast vollständig lösen können, indem wir ViewState deaktivieren, ohne Nebenwirkungen zu verursachen, werden MS-Architekten nicht so dumm sein, so süß zu sein (was nützt es, es als entbehrliche Sache zu belassen?), Weil wir es oft tun Dieses Übertragungslastproblem kann nicht durch einfaches Deaktivieren gelöst werden. Wir können nur einen anderen Weg finden, um das Übertragungsvolumen im Netzwerk-Roundtrip so gering wie möglich zu halten. Daher ist die Komprimierung unsere erste Wahl. Solange wir die SavePageStateToPersistenceMedium()-Methode und die LoadPageStateFromPersistenceMedium()-Methode der Page-Klasse überladen und die Daten in der überladenen Methode komprimieren und dekomprimieren. Die vom Open-Source-Projekt SharpZipLib bereitgestellten Klassen GZipInputStream und GZipOutputStream sind in unsere Sicht gekommen. Der Einfachheit halber könnten wir genauso gut eine Klasse CompressionHelper mit dem folgenden Code schreiben:
1using System.IO;
2mit ICSharpCode.SharpZipLib.GZip;
3
4Namespace Ycweb.Components
5{
6 /**//// <Zusammenfassung>
7 /// Zusammenfassende Beschreibung für CompressionHelper.
8 /// </summary>
9 öffentliche Klasse CompressionHelper
10 {
11 publicCompressionHelper()
12 {
13 //
14 // TODO: Konstruktorlogik hier hinzufügen
15 //
16}
17
18 /**//// <Zusammenfassung>
19 /// Daten komprimieren
20 /// </summary>
21 /// <param name="data">Zu komprimierendes Byte-Array</param>
22 /// <returns>Komprimiertes Byte-Array</returns>
23 öffentliches statisches Byte[] CompressByte(Byte[] Daten)
vierundzwanzig {
25 MemoryStream ms = new MemoryStream();
26 Stream s=new GZipOutputStream(ms);
27 s.Write(data, 0, data.Length);
28 s.Close();
29 return ms.ToArray();
30}
31
32 /**//// <Zusammenfassung>
33 /// Daten dekomprimieren
34 /// </summary>
35 /// <param name="data">Zu dekomprimierendes Byte-Array</param>
36 /// <returns>Dekomprimiertes Byte-Array</returns>
37 öffentliches statisches Byte[] DeCompressByte(Byte[] Daten)
38 {
39 byte[] writeData = neues Byte[2048];
40 MemoryStream ms= new MemoryStream( data );
41 Stream sm = new GZipInputStream(ms) as Stream;
42 MemoryStream outStream = new MemoryStream();
43 while (wahr)
44 {
45 int size = sm.Read(writeData,0, writeData.Length );
46 wenn (Größe >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
50 sonst
51 {
52 Pause;
53}
54 }
55 sm.Close();
56 byte[] outArr = outStream.ToArray();
57 outStream.Close();
58 return outArr;
59 }
60 }
61} Dann überladen wir die Methoden LoadPageStateFromPersistenceMedium() und SavePageStateToPersistenceMedium(Object viewState) in der von der Klasse Page abgeleiteten Seitensteuerungs-Basisklasse. Der Code lautet wie folgt:
1ViewState-Daten laden und speichern#region ViewState-Daten laden und speichern
2 geschütztes Überschreibungsobjekt LoadPageStateFromPersistenceMedium()
3 {
4//Lesen Sie Daten aus der von Ihnen registrierten versteckten Domäne __SmartViewState
5 string viewState = Request.Form["__SmartViewState"];
6 byte[] bytes = Convert.FromBase64String(viewState);
7 // Rufen Sie die oben bereitgestellte statische Methode CompressionHelper.DeCompressByte() auf, um die Daten zu dekomprimieren
8 Bytes = CompressionHelper.DeCompressByte(Byte);
9 LosFormatter formatter = new LosFormatter();
10 return formatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 protected override void SavePageStateToPersistenceMedium(Object viewState)
15 {
16 LosFormatter formatter = new LosFormatter();
17 StringWriterwriter = new StringWriter();
18 formatter.Serialize(writer, viewState);
19 string viewStateString = write.ToString();
20 Byte[] Bytes = Convert.FromBase64String(viewStateString);
21 // Rufen Sie die oben bereitgestellte statische Methode CompressionHelper.CompressByte() auf, um die Daten zu komprimieren
22 Bytes = CompressionHelper.CompressByte(Byte);
dreiundzwanzig
24 // Registrieren Sie ein neues verstecktes Feld __SmartViewState, Sie können es auch selbst definieren
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#endregion
Nach der obigen Verarbeitung sieht der Quellcode auf der Web-Ausgabeseite wie folgt aus:
<input type="hidden" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" value="" />
Das ursprüngliche versteckte Feld „__VIEWSTATE“ hat einen leeren Wert und wird durch ein neues verstecktes Feld „__SmartViewState“ ersetzt, das zum Speichern der komprimierten Zeichenfolge verwendet wird. Auf diese Weise ist der Beschleunigungseffekt offensichtlich Beispielsweise beträgt der ursprüngliche ViewState-String-Wert der Homepage von DG3G.COM etwa 28 KB und nach der Komprimierung 7 KB, während der ursprüngliche ViewState-String-Wert der Homepage von Acafa.com etwa 43 KB und nach der Komprimierung 8 KB beträgt. Diese Art der Verarbeitung ist durchaus zufriedenstellend. Wenn Sie der Meinung sind, dass dies nicht gründlich genug ist, können Sie die ViewState-Zeichenfolge natürlich auch in der Sitzung speichern. Wenn Sie dies jedoch tun, erhöht sich die Belastung des Serverspeichers erheblich (insbesondere bei großer Anzahl von Besuchen). Es wird empfohlen, es nicht leichtfertig zu verwenden. Wenn Ihr Webserver über 10 GB oder 8 GB Speicher verfügt, können Sie es auch ausprobieren. Der relevante geänderte Code ist unten angegeben:
Ändern Sie den Code im obigen Methodenkörper LoadPageStateFromPersistenceMedium():
string viewState = Request.Form["__SmartViewState"];
Ändern zu:
string viewState = Session["__SmartViewState"].ToString();
Fügen Sie gleichzeitig den Code im obigen SavePageStateToPersistenceMedium()-Körper hinzu:
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
Ändern zu:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Schließlich stammen die oben genannten Codes und Lösungen alle aus der VS2003-Entwicklungspraxis. Ich mache jedoch keine Versprechungen darüber, ob VS2005 geeignet ist Lösungen, ich werde sehr glücklich sein.