DevTrain

Autor: Rene Paschold

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:

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.

Erfasst am: 22.10.2004 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=937
© Copyright 2003 ppedv AG - http://www.ppedv.de