2009-04-02 4 views
3

Ich baue eine große Anwendung und normalerweise benutze ich eine einfache Sitzung, um private globale Informationen zu speichern, aber da die Anwendung ziemlich groß sein könnte, glaube ich, dass dies ein Problem aufgrund der sein könnte Anzahl der Speicher-Sitzungen, die es haben könnte.ASP.NET Speichern von globalen Variablen - zugänglich von jeder Seite

Gibt es eine bessere Möglichkeit, solche Variablen zu speichern?

Wenn sich der Benutzer zum Beispiel anmeldet, möchte ich Daten zu diesem Benutzer speichern und anzeigen, wo er benötigt wird, ohne jedes Mal die Datenbank abfragen zu müssen.

Antwort

3

Sitzungen sind der Weg, um hier zu bleiben, sie sind beabsichtigt, Informationen über die aktuelle Sitzung über Anfragen hinweg zu erhalten. Es gibt kein anderes Objekt im ASP.NET-Framework, das diese Absicht hat.

Sie können den Cache verwenden oder in der Anwendungssammlung speichern, aber die Verantwortung für die eindeutige Identifizierung der einzelnen Sitzungsdaten liegt bei Ihnen.

Es liegt auch an Ihnen, die Sitzung zu beenden und die in diesen Sammlungen gespeicherten Instanzen (Cache oder Anwendung) freizugeben.

Es ist wirklich eine schlechte Idee, diese Fragen zu stellen, basierend darauf, was Sie "denken" könnten. Dies ist eine Form der vorzeitigen Optimierung, die Sie vermeiden sollten. Verwenden Sie vielmehr Sitzungen, wie sie für diesen Zweck vorgesehen waren, messen Sie dann, wo Ihre Engpässe liegen, und beheben Sie diese, sollte die Leistung beim Testen ein Problem darstellen.

3

verwenden Cookies - sie funktionieren würden, unabhängig von Ihrem Lastausgleich Umgebungen

andere Optionen sind:

1) Ihre sessionvalues ​​zu einer SQL-Datenbank zu schreiben - Sie Ihre asp.net App so konfigurieren, dass Sitzungszustand konfigurieren sql server verwenden - aber das hat seine eigenen probleme als sessions nie time out (also müssen sie dies über code explizit handhaben)

2) wenn nicht sql server verwenden - im Grunde würden Sie ein Problem haben, wenn Sie zu viele haben Benutzer und Sie implementieren Load Balancing auf Ihrem Webserver - so kann ein Benutzer in ein anderes Web gehen Server in der gleichen Sitzung (und es würde nicht funktionieren)

gibt es eine Arbeit um für diese auch - seinen Namen STICKY SESSIONS - wo Sie Ihre Web-Server Ihre Benutzer garantiert würde treffen immer die gleiche Web-Server innerhalb der Sitzung

3) mit .net 2.0 Provider-Modell, können Sie sogar Ihren eigenen Sitzungsspeicheranbieter schreiben, indem Sie ihre Delegierten implementieren - so können Sie Ihre eigenen XML-Dateien auf Ihrem Webserver/Shared Server erstellen, um Sitzungsdaten dort zu lesen/schreiben :-)

so gibt es viele Möglichkeiten, die Sie lösen können. Die einfachste und kostengünstigste Lösung ist die Verwendung von Cookies

1

Sie könnten Cache verwenden. Das hat eingebauten Mechanismus, um freizugeben, wenn der Speicher ausgeht ...

+0

und hängt nicht von Client-Cookie-Einstellungen ab – annakata

0

Wenn Sie denken, dass Ihre Daten für die Sitzung zu groß ist, würde ich eine Datenbank von irgendeiner Art mit Cache, so dass Sie nicht unnötig Anrufe.

0

Wenn es sich um Daten pro Benutzer-Sitzung handelt, die Sie speichern, ist die ASP.NET-Sitzung definitiv Ihre beste Wahl. Wenn Sie sich am meisten Sorgen über die Speichernutzung machen, können Sie den MSSQL-Modus verwenden. Die Daten müssen irgendwo gespeichert werden und die Auswahl des zu verwendenden Sitzungsmodus hängt von Ihrer Umgebung und den Nutzungsmustern Ihrer Benutzer ab.

0

Gehen Sie nicht davon aus, dass ein Problem mit der Größe des Sitzungsstatus besteht, bis Sie ein solches Problem sehen und versuchen, es zu lösen. Zum Beispiel ist es möglich, dass, obwohl die Anwendung als Ganzes eine große Menge an Sitzungszustand verwenden kann, ein gegebener Benutzer möglicherweise nicht so viel im Verlauf einer Sitzung verwendet.

Es ist auch möglich, dass die Änderung von dem Standard-Sitzungszustandsanbieter zu dem SQL-Provider oder dem Statusserveranbieter ein Speicherproblem erleichtern würde.

Sie können Cache verwenden, aber Cache ist anwendungsweit. Sie müssten Cache-Einträge mit der Benutzer-ID oder Sitzungs-ID qualifizieren: .

Verwenden Sie auf keinen Fall statische Variablen zum Speichern dieser Daten. Wie von Ihrer Betreffzeile vorgeschlagen, sind sie anwendungsweit, nicht pro Benutzer.

1

Verwenden Sie definitiv Cookies für diese. Der beste Ansatz besteht darin, sich selbst eine Cookie-Wrapper-Klasse zu erstellen, die alle schweren Aufgaben für Sie erledigen wird - prüfen, ob der Cookie null ist, auf den http-Kontext zugreifen usw. Sie müssen Ihren Code nicht mit all dem durcheinander bringen; abstrahiere einfach alles in cookies.cs oder .vb.

SetCookieValue(someValue, cookieName); //there will be some expiration concerns here as well 

myValue = GetCookieValue(cookieName); 

Christian Weiss has a good strategy.

Verwandte Themen