Es ist notwendig, Zustandsinformationen für Webseiten und ihre Steuerelemente zu verwalten. Da Webanwendungen jedoch auf dem HTTP-Protokoll basieren, bei dem es sich um ein zustandsloses Protokoll handelt, wird die Verwaltung von Zustandsinformationen sehr schwierig. Um dieses Problem zu lösen, bietet die ASP.NET 2.0-Technologie eine Vielzahl von Lösungen, z. B. die Verwendung von Sitzung, Cookie, Ansichtsstatus, Steuerstatus, ausgeblendeten Feldern, Abfragezeichenfolgen, personalisierter Benutzerkonfiguration (Profil) usw. Für die Verwendung der ASP.NET 2.0-Technologie zum Erstellen von Serversteuerelementen ist die Verwaltung von Statusinformationen ebenfalls sehr wichtig. Die Hauptlösung besteht darin, den Ansichtsstatus und den Steuerelementstatus zu verwenden. In diesem Artikel werden die Grundkenntnisse des Ansichtsstatus (ViewState) ausführlich erläutert und die Anwendungsmethode des Ansichtsstatus anhand typischer Anwendungen vorgestellt.
Überblick über den Ansichtsstatus
Der Ansichtsstatus ist eine sehr wichtige Technologie, die es der Seite und den Steuerelementen auf der Seite ermöglicht, Statusinformationen während der Hin- und Rückfahrt vom Server zum Client und zurück vom Client beizubehalten. Auf diese Weise kann ein zustandsbehafteter und kontinuierlich ausgeführter Seiteneffekt auf einer zustandslosen Umgebung wie dem Web erstellt werden. In diesem Abschnitt werden hauptsächlich der Betriebsmechanismus, Anwendungsmethoden, gespeicherte Datentypen, Leistung und Sicherheit, das Blockieren des Ansichtsstatus (dies ist eine neue Funktion von ASP.NET 2.0) sowie die Vor- und Nachteile des Ansichtsstatus vorgestellt.
(1)
Der spezifische Ausführungsprozess des Ansichtsstatus des Ausführungsmechanismus lautet: Immer wenn der Benutzer eine ASPX-Seite anfordert, serialisiert das .NET Framework zunächst die Statusdaten der zugehörigen Steuerelemente in eine Zeichenfolge und erstellt daraus dann eine benannte Datei __VIEWSTATE Der Wert des ausgeblendeten Felds wird an den Client gesendet. Wenn die Seite zum ersten Mal angefordert wird, wird auch das Serversteuerelement zum ersten Mal ausgeführt. Das versteckte Feld mit dem Namen __VIEWSTATE enthält nur die Standardinformationen des Steuerelements, die normalerweise leer oder null sind. Im nachfolgenden Postback-Ereignis wird der Eigenschaftsstatus des im vorherigen Postback verfügbaren Serversteuerelements in ViewState gespeichert. Dadurch kann die Serversteuerung den Status überwachen, bevor das aktuell behandelte Postback-Ereignis auftritt. Diese Prozesse werden vom .NET-Framework verwaltet, und für Benutzer hat die Ausführung der ASPX-Seite den Effekt einer kontinuierlichen Ausführung.
(2) Gespeicherte Datentypen
Der Ansichtsstatus kann mehrere Datentypen speichern. Um die Betriebseffizienz zu verbessern, enthält der Ansichtsstatus selbst auch eine Reihe optimierter Serialisierungsmethoden für gängige Typen. Zu den von der View-State-Serialisierungsmethode standardmäßig unterstützten Datentypen gehören: String, Int32, Unit, Color, Array, ArrayList, HashTable und der benutzerdefinierte Typkonverter TypeConverter.
Der Ansichtsstatus wurde für Array-, ArrayList- und HashTable-Objekte optimiert, die die oben aufgeführten Typen enthalten. Daher sollten Sie bei der Verwendung des Ansichtsstatus in Steuerelementen versuchen, die Verwendung auf die oben genannten einfachen Datentypen sowie auf optimierte Typen zu beschränken. Hier müssen wir uns auf den benutzerdefinierten Typkonverter TypeConverter konzentrieren, der eine einheitliche Methode zum Konvertieren des Werttyps in andere Typen und zum Zugriff auf Standardwerte und Untereigenschaften bereitstellt. Beispielsweise können Sie TypeConverter verwenden, um eine Zeichenfolge in einen numerischen Wert oder einen numerischen Wert in eine Zeichenfolge umzuwandeln. Wenn kein Typkonverter vorhanden ist, verwendet das Seitenframework die vom .NET-Framework bereitgestellte binäre Serialisierungsfunktion, um das Objekt zu serialisieren. Dieser Vorgang ist sehr ressourcenintensiv.
(3) Leistung und Sicherheit
Bei Verwendung des Ansichtsstatus müssen Objekte zuerst serialisiert und dann per Postback deserialisiert werden. Wir müssen also etwas über die ViewState-Leistung wissen. Standardmäßig ist ViewState des Steuerelements aktiviert. Wenn Sie ViewState nicht verwenden müssen, deaktivieren Sie es am besten. ViewState wird in den folgenden Situationen nicht mehr benötigt: (1) Das Steuerelement definiert keine serverseitigen Ereignisse (die Steuerereignisse sind derzeit alle clientseitige Ereignisse und nehmen nicht am Postback teil); keine dynamischen oder datengebundenen Eigenschaftswerte. Die Möglichkeit, den Ansichtsstatus zu deaktivieren, besteht darin, den EnableViewState-Wert des Steuerelements auf „false“ zu setzen, d. h. EnableViewState="false".
Wenn der Inhalt im Zusammenhang mit dem Ansichtsstatus kompiliert und an den Client gesendet wird, sieht der Leser standardmäßig den Inhalt des versteckten Felds __VIEWSTATE im HTML-Code der Seite. Hierbei handelt es sich um einige bedeutungslose Zeichenfolgen, die das Ergebnis der Codierung des relevanten Inhalts durch das .NET Framework durch Base64-Codierung sind. Sie werden im Klartext zwischen Client und Server hin und her gesendet. In manchen Fällen, etwa wenn es um vertrauliche Inhalte wie Passwörter, Konten, Verbindungszeichenfolgen usw. geht, ist die Verwendung der Standardmethode sehr unsicher. Zu diesem Zweck bietet das .NET Framework zwei Sicherheitsmechanismen für ViewState:
Überprüfungsmechanismus:
Sie können das .NET Framework anweisen, einen Hash-Code an die ViewState-Daten anzuhängen, indem Sie das Attribut EnableViewStateMAC="true" festlegen (der Hash-Code ist ein A SHA1-Typ mit einer Länge von 160 Bit, sodass die Ausführungsleistung erheblich beeinträchtigt wird. Wenn ein Postback-Ereignis auftritt, wird der Hash-Code wiederhergestellt und muss mit dem ursprünglichen Hash-Code übereinstimmen. Auf diese Weise kann effektiv überprüft werden, ob der ViewState während des Übertragungsvorgangs manipuliert werden kann. Standardmäßig verwendet das .NET Framework den SHA1-Algorithmus, um ViewState-Hashcodes zu generieren. Darüber hinaus können Sie den MD5-Algorithmus auch auswählen, indem Sie
· Der Verschlüsselungsmechanismus
verwendet Verschlüsselung, um die tatsächlichen Datenwerte in ViewState-Feldern zu schützen. Zunächst muss EnableViewStatMAC="true" wie oben beschrieben gesetzt werden. Legen Sie dann den machineKey-Validierungstyp auf 3DES fest, d. h.
(4) Blockieren des Ansichtsstatus
Der obige Inhalt führt in einige Grundkenntnisse des Ansichtsstatus ein. Einige Leser sind jedoch möglicherweise verwirrt: Was passiert, wenn die Ansichtsstatusdaten in einigen Fällen sehr groß werden? Dies wird natürlich einige unbeabsichtigte Folgen haben. Zu diesem Zweck fügt ASP.NET 2.0 eine neue Funktion namens „View State Blocking“ hinzu. Wenn die Datenmenge im Ansichtszustand zu groß wird, werden die Daten beim Ansichtszustands-Chunking automatisch in mehrere Blöcke aufgeteilt und in mehreren ausgeblendeten Formularfeldern abgelegt.
Um das Chunking des Ansichtsstatus zu aktivieren, legen Sie die MaxPageStateFieldLength-Eigenschaft auf die maximal zulässige Größe in Bytes für ein einzelnes Ansichtsstatusfeld fest. Wenn die Seite an den Server zurückgesendet wird, analysiert die Seite die Ansichtsstatuszeichenfolge während der Seiteninitialisierungsphase und stellt die Eigenschaftsinformationen auf der Seite wieder her. Die Standardeinstellung ist -1, was bedeutet, dass es keine maximale Größe gibt und der Ansichtsstatus nicht in Blöcke unterteilt wird.
(5) Vor- und Nachteile
Die Verwendung des Ansichtsstatus hat die folgenden drei Vorteile: 1. Es verbraucht weniger Serverressourcen (im Vergleich zu Anwendung und Sitzung). Weil die Ansichtsstatusdaten auf den Clientcomputer geschrieben werden. 2. Pflegeleicht. Standardmäßig ermöglicht das .NET-System automatisch die Pflege von Kontrollstatusdaten. 3. Erweiterte Sicherheitsfunktionen. Werte im Ansichtsstatus werden gehasht, komprimiert und anhand der Unicode-Implementierung codiert, was sicherer ist als die Verwendung versteckter Felder.
Die Verwendung des Ansichtsstatus hat die folgenden drei Nachteile: 1. Leistungsaspekte. Da der Ansichtsstatus in der Seite selbst gespeichert wird, kann es beim Speichern eines großen Werts dazu kommen, dass der Benutzer beim Anzeigen und Senden der Seite immer noch verlangsamt wird, selbst wenn der Ansichtsstatus fragmentiert ist. 2. Einschränkungen der Ausrüstung. Mobilgeräte verfügen möglicherweise nicht über genügend Speicherkapazität, um große Mengen an Ansichtsstatusdaten zu speichern. Daher wird beim Verschieben von Serversteuerelementen auf einem Gerät eine andere Implementierungsmethode verwendet. 3. Mögliche Sicherheitsrisiken. Der Ansichtsstatus wird in einem oder mehreren ausgeblendeten Feldern auf der Seite gespeichert. Obwohl View State Daten in einem Hash-Format speichert, können sie manipuliert werden. Wenn Sie die Ausgabequelle der Seite direkt anzeigen, können Sie Informationen in ausgeblendeten Feldern sehen, was zu potenziellen Sicherheitsproblemen führen kann.
Typische Anwendungen
Bei der Entwicklung von Serversteuerelementen mithilfe der ASP.NET 2.0-Technologie gibt es viele Aspekte, bei denen der Ansichtsstatus verwendet werden kann. Es ist üblich, das ViewState-Wörterbuch zum Implementieren von Serversteuerungseigenschaften zu verwenden. ViewState ist vom Typ System.Web.UI.StateBag – ein Wörterbuch von Schlüssel/Wert-Paaren, in dem Eigenschaftswerte der Serversteuerung gespeichert werden können. Im Folgenden wird anhand eines typischen Beispiels die Anwendungsmethode von ViewState veranschaulicht.
Im benutzerdefinierten Serversteuerelement LabelInViewState sind zwei Eigenschaften Text und TextInViewState implementiert. Ersteres wird mithilfe privater Variablen erstellt und letzteres wird mithilfe von ViewState implementiert. Sie alle dienen dazu, Textinhalte abzurufen oder festzulegen. Der Quellcode der benutzerdefinierten Steuerelementimplementierungsdatei LabelInViewState.cs lautet wie folgt.
using System;using System.Collections.Generic; using System.ComponentModel;using System.Text; mit System.Web; mit System.Web.UI; mit System.Web.UI.WebControls;namespace WebControlLibrary{ [DefaultProperty("Text")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] öffentliche Klasse LabelInViewState: WebControl { private string _text; //Implementieren Sie das Textattribut public string Text { erhalten { return (_text == null) ? string.Empty : _text; } set { _text = value } } //ViewState verwenden, um die TextInViewState-Eigenschaft zu implementieren public string TextInViewState { erhalten { String s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty : s); } set { ViewState["TextInViewState"] = value; } // Die RenderContents-Methode überschreiben protected override void RenderContents(HtmlTextWriter-Ausgabe) { Ausgabe.Write("Text = "); Ausgabe.Write(Text); Ausgabe.Write(" "); Ausgabe.Write("TextInViewState = "); Ausgabe.Write(TextInViewState); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <script runat="server"> void Button1_Click(object sender, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </script> <head runat="server"> </Kopf> <body style="font-size: small;"> <form id="form1" runat="server"> <div> Name: |
Der oben auf der Seite angezeigte Code enthält zwei Textfelder, zwei Schaltflächen und ein benutzerdefiniertes Serversteuerelement LabelInViewState. Wie im Ereignishandler Button1_Click gezeigt, ruft das LabelInViewState-Steuerelement beim Klicken auf die Schaltfläche „Senden“ den Text im Textfeld ab und zeigt ihn an. Die Anwendungsrenderings sind in den Abbildungen 1 und 2 dargestellt.
Abbildung 1 Klicken Sie auf die Schaltfläche „Senden“. | Abbildung 2 Klicken Sie auf die Schaltfläche „Neu laden“. |