DevTrain Startseite Advanced Developers Conference vom 14.-15. Februar 2011  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Rene Paschold Artikel Drucken
        
ViewState auf dem Server speichern

ViewState ist ein tolle Sache, aber was passiert wenn man doch ziemlich viel in ViewState speichert? Irgendwann leidert doch die Performance. Ein Lösungsansatz wäre, die ViewState Variable auf dem Server zu speichern. Dazu müssen folgende Methoden überschrieben werden:
    LoadPageStateFromPersistenceMedium()
    in dieser Methode werden alle gespeicherten Informationen über den Anzeigestatus in das Page-Objekt geladen.

    protected override object LoadPageStateFromPersistenceMedium()
    {
     object vs;
      StreamReader reader = new StreamReader(GenerateFilename());
     string cont = reader.ReadToEnd();
      reader.Close();

      LosFormatter form = new LosFormatter();

      try
     
    {
        vs = form.Deserialize(cont);
      }
     catch(Exception ex)
      {
       throw new HttpException("ViewState konnte nicht gelesen werden!");
      }
     return vs;
    }

     

    Als erstes wird ein StreamReader() Objekt erstellt. Die Methode GenerateFilename() wird weiter unten vorgestellt. Der Inhalt der jetzt gelesen wird, wird in die Variable cont gepackt. Dann wird über die Klasse LosFormatter() versucht, den ViewState der aus der Textdatei geliefert wurde zu deserializieren.

    Bis auf den LosFormatter() hier nichts außergewöhnliches. Der LosFormatter() macht nichts anderes als den Anzeigestatus einer Page zu serialisieren oder deserialisieren. Daher muss auch nicht näher auf diese Klasse eingegangen werden da die Funktionalität recht einfach ist.

    SavePageStateToPersistenceMedium(object viewState)
    Hier erfolgt das speichern des Anzeigestatus einer Page.

    protected override void SavePageStateToPersistenceMedium(object viewState)
    {
      StreamWriter writer = new StreamWriter(GenerateFilename());
      LosFormatter form = new LosFormatter();
      form.Serialize(writer, viewState);
      writer.Close();
    }

     

    Mittels StreamWriter() und dem LosFormatter() wird nun der ViewState in eine Text-Datei gespeichert.

    Alles schön und gut, nur wie ist es jetzt möglich den ViewState explizit einer Seite und einem User zuzuordnen? Relativ einfach. Der Name der Datei ist entscheidend und dieser wird durch eine entsprechende Funktion generiert.

    private string GenerateFilename()
    {
      string file = this.Request.Url.ToString() +
      "_" + this.Session.SessionID;
      file = file.Replace(".", "_");
      file = file.Replace(":", "_");
      file = file.Replace("/", "_");
      file = Server.MapPath(file + ".txt");

      return file;
    }

     

    Der Dateiname setzt sich aus folgenden Teilen zusammen:

    • Die URL, damit auch wirklich pro Seite ein eigener ViewState gespeichert werden kann.
    • Der SessionID des Users, damit der ViewState auch eindeutig zugeordnet werden kann.
    Dann werden die Sonderzeichen raus geparst und schon hat meinem einen eindeutigen Namen der einem User und einer Seite zugeordnet werden kann.

    All das sollte reichen damit der ViewState nicht mehr im Client mitgeführt wird. Die Vorteile liegen auf der Hand. Es werden weniger Daten übertragen und der ViewState kann auch von dritten nicht mehr entschlüsselt werden.

    DevTrain Camp - Schneller zum .NET 3.5 Developer
     
    Verwandte Artikel      Verlinkte Dokumente
      Keine verknüpften Dokumente
      Keine Links vorhanden

      Erfasst am: 22.10.2004
      Gültig bis: 20.01.2005
    20 Ratings
    Bewertung: 94,0%
    schlecht    sehr gut  

     
    © Copyright 2007 ppedv AG