Was ist wirklich in Session in ASP.NET gespeichert?

8

Wir versuchen zu entscheiden, wie die Objektpersistenz bei Postbacks gehandhabt wird, um zu vermeiden, dass die Daten aus der Datenbank bei jeder Anfrage abgerufen werden. Ich möchte Session verwenden (es handelt sich um eine Intranetanwendung, es werden nicht Tausende von Benutzern sein) ), aber das liegt daran, dass ich vermute, dass dort nur der Verweis auf das reale Objekt gespeichert ist ...

Weiß jemand wirklich, ob das stimmt?

Ich habe schon immer gelernt, das Session-Objekt nicht zu benutzen, aber wenn es so funktioniert, wäre das kein großes Problem ...

Was wirklich in der Sitzung gespeichert ist:

%Vor%

Das eigentliche serialisierte Objekt oder seine Referenz?

    
juan 02.12.2008, 19:30
quelle

6 Antworten

7

Ich habe es versucht:

Ich habe eine Klasse erstellt und eine Instanz davon in der Sitzung gespeichert (Sitzungsmodus: InProc). Instanz lebt in aspnet_wp.exe proc.

Dann änderte ich den Sitzungsstatus zu SQL Server (immer noch ohne [Serializable] Attribut) und ich bekam den folgenden Fehler.

Der Sitzungsstatus konnte nicht serialisiert werden. Im Modus "StateServer" und "SQLServer" serialisiert ASP.NET die Sitzungszustandsobjekte, weshalb nicht serialisierbare Objekte oder MarshalByRef-Objekte nicht zulässig sind.

Es gibt also keine Serialisierung für den Status der inProc-Sitzung.

Prost ... Martín

    
Gargi 02.12.2008, 20:05
quelle
4

ASP.NET erstellt eine GUID, die standardmäßig in einem Cookie gespeichert ist (Sie können jedoch die Verwendung des Querystrings angeben), um den Benutzer zu identifizieren. Die mit diesem Cookie verknüpften Objekte werden standardmäßig auf dem Server im IIS-Prozess gespeichert.

Sie können auch benutzerdefinierte Sitzungsobjektspeicher (Sitzungszustandsspeicheranbieter) erstellen, wenn Sie beispielsweise Sitzungsobjekte nicht verarbeiten möchten.

Weitere Informationen hier:

Ссылка

Aber um deine Frage wirklich zu beantworten ...

Sie haben mit der Annahme, dass der Sitzungsspeicher nur einen Verweis auf das Objekt speichert, die richtige Einstellung.

Obwohl Sie das Speicherverhalten der Session-Funktionalität in der web.config angeben können, glaube ich, auch Serialisierung zu erreichen. Die 3 Modi:

  • InProc - Sitzung als Live-Objekte im Webserver (aspnet_wp.exe) gehalten. Verwenden Sie die "cookieless" -Konfiguration in web.config, um die sessionId auf die URL zu "munge" (löst auch Cookie- / Domänen- / Pfad-RFC-Probleme!)
  • StateServer - Sitzung serialisiert und im Arbeitsspeicher in einem separaten Prozess (aspnet_state.exe) gespeichert. State Server kann auf einem anderen Computer ausgeführt werden
  • SQLServer - Sitzung serialisiert und in SQL Server gespeichert

Das obige stammt von: Ссылка

    
Ben 02.12.2008 19:39
quelle
4

Es kommt darauf an, welche Sitzung Sie verwenden, wenn Sie inproc-Sitzung verwenden, in der Sitzung, aber während es selbst verweist es nur eine Verknüpfung zu einem Objekt, hält es das gesamte Objekt in den Prozess Speicher, also wenn Sie entwerfen Ihre Bewerbung ist sehr wünschenswert, um zu wissen, wie viele Daten Sie pro Benutzer haben und wie viele aktive Benutzer Sie pro Stunde haben werden. Das Objekt innerhalb des Prozessspeichers wird nicht serialisiert, wenn Sie in der proc-Sitzung verwenden. Es wird jedoch serialisiert, wenn Sie eine out-of-proc-Sitzung verwenden. Es kann Implementierungen zur Leistung durchführen.

Ich denke, hier findest du sehr gute Übersicht über Session und Cache

    
MichaelT 02.12.2008 19:42
quelle
2

Es gibt Unmengen von Artikeln und Blog-Posts, die die Verwendung von komplexen Objekten (die technische Verweise auf diese Objekte speichern) in Session-Variablen bedauern. Im Allgemeinen denke ich, dass Sitzungsvariablen die Arbeit des Teufels sind und alles tun, um sie zu vermeiden.

Für eine Intranet-Deployment-App, bei der der Entwickler die Auswirkungen von Session-Sessions auf die Skalierbarkeit versteht, wie Juan Manuel beschreibt, habe ich das schon oft und mit großem Erfolg getan. Ja, die Sitzung kann einen Recyle durchführen, aber das ist ein ungewöhnlicher Randfall - das tritt nicht regelmäßig genug auf, um Browser-Apps mit rationalem Sitzungszeitlimit zu beeinträchtigen.

Ich würde sagen, bauen Sie die App so, wie Sie es vorschlagen, Juan Manuel, zumindest auf den ersten Blick. Aber squirrle weg, wo Sie speichern und Objekte von der Sitzung (mit einer Wrapper-Klasse vielleicht), so dass, wenn die Anwendung verlangt, es ist einfach, später zu ändern.

    
rp. 02.12.2008 20:08
quelle
0

Es ist wichtig, daran zu denken, dass die Daten der In-Proc-Sitzung ziemlich zerbrechlich sind ... was bedeutet, dass sie möglicherweise nicht da sind, wenn Sie sie am meisten brauchen. Wenn der Worker-Prozess aus irgendeinem Grund wiederverwendet wird, ist poof weg.

    
Webjedi 02.12.2008 19:51
quelle
0

Ich verstehe, dass Sie momentan keine großen Probleme mit der Leistung haben und die Sitzung wahrscheinlich gut funktionieren würde; Es gibt jedoch andere Möglichkeiten, den Status beizubehalten oder Daten über Postbacks hinweg zu transportieren.

Wenn Sie versuchen, Daten über Postbacks derselben Seite zu persistieren, dann würde ich stattdessen den ViewState empfehlen. Beachten Sie, dass in ViewState gespeicherte Daten serialisiert sind und jedes Objekt, das Sie persistieren möchten, ISerializable implementieren muss.

    
Victor 02.12.2008 19:56
quelle