10 Stimmen

Verschieben von ViewState aus der Seite heraus?

Wir versuchen, die Seitenlast so weit wie möglich zu verringern. Da ViewState manchmal bis zu 100k der Seite anschwellen kann, würde ich es gerne komplett eliminieren.

Ich würde gerne einige Techniken hören, die andere Leute verwendet haben, um ViewState zu einem benutzerdefinierten Anbieter zu verschieben.

Dennoch gibt es ein paar Vorbehalte:

  • Wir haben im Durchschnitt 2 Millionen Besucher pro Stunde.
  • Aus diesem Grund sind Datenbanklesungen ein ernsthaftes Problem in der Leistung, so dass ich nicht ViewState in der Datenbank speichern möchte.
  • Wir sind auch hinter einem Load Balancer, so dass jede Lösung muss mit dem Benutzer Bouncing von Maschine zu Maschine pro Postback arbeiten.

Ideen?

5voto

Mike Punkte 1893

Wie gehen Sie mit dem Sitzungsstatus um? Es gibt einen eingebauten Provider, der den Viewstate im Session State speichert. Wenn Sie den Sitzungsstatus in einem schnellen System außerhalb des Proc-Systems speichern, könnte dies die beste Option für den Viewstate sein.

edit: um dies zu tun, fügen Sie den folgenden Code in Ihre Seitenklassen / globale Seitenbasisklasse ein

    protected override PageStatePersister PageStatePersister {
        get { return new SessionPageStatePersister(this); }
    }

Auch... dies ist keineswegs eine perfekte (oder sogar gute) Lösung für einen großen Viewstate. Wie immer gilt es, die Größe des Viewstate so weit wie möglich zu minimieren. Der SessionPageStatePersister ist jedoch relativ intelligent und vermeidet die Speicherung einer unbegrenzten Anzahl von Viewstates pro Sitzung sowie die Speicherung nur eines einzigen Viewstates pro Sitzung.

2voto

Dale Ragan Punkte 18091

Als zuvor angegeben Ich habe in der Vergangenheit die Datenbank verwendet, um den ViewState zu speichern. Obwohl dies für uns funktioniert, erreichen wir nicht annähernd 2 Millionen eindeutige Besucher pro Stunde.

Ich denke, dass eine Hardware-Lösung definitiv der richtige Weg ist, egal ob mit dem StrangeLoop Produkte oder ein anderes Produkt.

2voto

leppie Punkte 111830

Das Folgende funktioniert bei mir ganz gut:

string vsid;

protected override object LoadPageStateFromPersistenceMedium()
{
  Pair vs = base.LoadPageStateFromPersistenceMedium() as Pair;
  vsid = vs.First as string;
  object result = Session[vsid];
  Session.Remove(vsid);
  return result;
}

protected override void SavePageStateToPersistenceMedium(object state)
{
  if (vsid == null)
  {
    vsid = Guid.NewGuid().ToString();
  }
  Session[vsid] = state;
  base.SavePageStateToPersistenceMedium(new Pair(vsid, null));
}

2voto

Erick Sgarbi Punkte 1212

Ich habe viele Möglichkeiten getestet, um die Last der Ansicht Zustand von der Seite zu entfernen und zwischen allen Hacks und einige Software da draußen die einzige Sache, die es wirklich skalierbar ist, ist die StrangeLoops As10000-Gerät . Transparent, keine Notwendigkeit, die zugrunde liegende Anwendung zu ändern.

1voto

saille Punkte 8687

Sie können ViewState jederzeit komprimieren, so dass Sie die Vorteile von ViewState nutzen können, ohne so viel Platz zu verschwenden:

public partial class _Default : System.Web.UI.Page {

  protected override object LoadPageStateFromPersistenceMedium() {
    string viewState = Request.Form["__VSTATE"];
    byte[] bytes = Convert.FromBase64String(viewState);
    bytes = Compressor.Decompress(bytes);
    LosFormatter formatter = new LosFormatter();
    return formatter.Deserialize(Convert.ToBase64String(bytes));
  }

  protected override void SavePageStateToPersistenceMedium(object viewState) {
    LosFormatter formatter = new LosFormatter();
    StringWriter writer = new StringWriter();
    formatter.Serialize(writer, viewState);
    string viewStateString = writer.ToString();
    byte[] bytes = Convert.FromBase64String(viewStateString);
    bytes = Compressor.Compress(bytes);
    ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
  }

  // ...

}

using System.IO;
using System.IO.Compression;

public static class Compressor {

  public static byte[] Compress(byte[] data) {
    MemoryStream output = new MemoryStream();
    GZipStream gzip = new GZipStream(output, 
                      CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();
    return output.ToArray();
  }

  public static byte[] Decompress(byte[] data) {
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;
    GZipStream gzip = new GZipStream(input, 
                      CompressionMode.Decompress, true);
    MemoryStream output = new MemoryStream();
    byte[] buff = new byte[64];
    int read = -1;
    read = gzip.Read(buff, 0, buff.Length);
    while(read > 0) {
      output.Write(buff, 0, read);
      read = gzip.Read(buff, 0, buff.Length);
    }
    gzip.Close();
    return output.ToArray();
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X