Nochmals: Statische Objekte und global.asax

25/02/2008 - 07:44 von Jürgen Kraus | Report spam
Guten Morgen!

Seit mehreren Tagen schlage ich mich mit diesem Problem herum und finde
keine Lösung. Weder Google, noch meine dicken Bücher scheinen die
notwendigen Informationen zu liefern.

Zur Situation: Wir entwickeln gerade mit VS2005 eine ASP.NET-Anwendung in
VisualBasic. Als Session-Management habe ich mir eine Methode ausgeschaut,
die mir die einfachste & eleganteste zu sein scheint: die Einrichtung
eines Objekts in der global.asax.

Mein Code in der global.asax sieht wie folgt aus:

<% Application Language="VB" %>
<object id="mySession"
runat="server"
scope="session"
class="SessionData"
/>

.
.
.

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
mySession.StartTime = System.DateTime.Now

End Sub

.
.
.



Dazu habe ich eine Klasse "SessionData" im Unterordner App_Code angelegt,
die die von mir gewünschten Session-Daten als Properties anbietet und
<serializable> ist.

ALLE Bücher und Texte, die ich dazu gelesen habe, behaupten nun, dass
diese global erstellte Klasse auf jeder Seite der Anwendung zugreifbar ist
- und zwar direkt über ihre Properties. (Z.B. MSDN-Dokumentation oder auch
H. Schwichtenberg, ASP.NET 2.0 mit Visual Basic 2005, S. 658 ff.)

Nach meinem Verstàndnis sollte ich also auf jeder x-beliebigen Seite (im
CodeBehind) z.B. folgende Zeile schreiben können:

Label1.Text = mySession.StartTime.ToString()


Genau das funktioniert aber nicht! Wenn ich die Anwendung starte, dann
wird beim Kompilieren eine Fehlermeldung für die anderen Seiten angezeigt:
"Der Name mySession wurde nicht deklariert." Lediglich der erste Aufruf in
der global.asax (s.o.) scheint zu klappen, da der Compiler keinen Fehler
meldet.

Ja, warum denn? Ich denke, der wurde global deklariert und steht im
gesamten Namespace der Anwendung zur Verfügung? Zumindest wird das überall
behauptet.

Ich weiß, dass es andere Möglichkeiten gibt, z.B. Anlegen einer neuen
Instanz der Session und Zuweisen zu einer Session-Variable. Das finde ich
aber nicht so elegant, weil ich dann überall in der Anwendung erst einmal
die Instanz wieder aus der Session-Variable in eine lokale Objektvariable
auslesen muss und erst danach auf die Properties zurückgreifen kann. Ich
möchte die oben beschriebene Methode einfach *verstehen*. Schließlich soll
es theoretisch ja genau so funktionieren.

Kann mich denn jemand dazu aufklàren? Ich verzweifel hier so langsam.
Vielleicht ist es ja nur eine Kleinigkeit, die ich übersehen habe.

Schon mal vielen Dank im voraus!

mfg

Jürgen Kraus
 

Lesen sie die antworten

#1 Thomas Bandt
25/02/2008 - 08:19 | Warnen spam
Jürgen Kraus schrieb:
Zur Situation: Wir entwickeln gerade mit VS2005 eine ASP.NET-Anwendung
in VisualBasic. Als Session-Management habe ich mir eine Methode
ausgeschaut, die mir die einfachste & eleganteste zu sein scheint: die
Einrichtung eines Objekts in der global.asax.



Mir ist nicht klar warum man die Application-Collection für
so etwas vergewaltigen sollte, wo es doch
System.Web.HttpContext.Current.Session gibt.

ALLE Bücher und Texte, die ich dazu gelesen habe, behaupten nun, dass
diese global erstellte Klasse auf jeder Seite der Anwendung zugreifbar
ist - und zwar direkt über ihre Properties. (Z.B. MSDN-Dokumentation
oder auch H. Schwichtenberg, ASP.NET 2.0 mit Visual Basic 2005, S. 658 ff.)



Hast du mal einen Link zum Artikel in der MSDN?

Nach meinem Verstàndnis sollte ich also auf jeder x-beliebigen Seite (im
CodeBehind) z.B. folgende Zeile schreiben können:

Label1.Text = mySession.StartTime.ToString()


Genau das funktioniert aber nicht! Wenn ich die Anwendung starte, dann
wird beim Kompilieren eine Fehlermeldung für die anderen Seiten
angezeigt: "Der Name mySession wurde nicht deklariert." Lediglich der
erste Aufruf in der global.asax (s.o.) scheint zu klappen, da der
Compiler keinen Fehler meldet.



Das kann nur funktionieren, wenn schon Visual Studio dir eine
entsprechende Wrapper-Klasse erstellt, die dann im Kontext von
Page usw. zur Verfügung steht - wie das z.B. für das Profil eines
Users der Fall ist.

Ja, warum denn? Ich denke, der wurde global deklariert und steht im
gesamten Namespace der Anwendung zur Verfügung? Zumindest wird das
überall behauptet.



Wie geschrieben - gib mal den Link, kann ich mir so jedenfalls
nicht vorstellen. Habe ich noch nie von gehört.

Ich weiß, dass es andere Möglichkeiten gibt, z.B. Anlegen einer neuen
Instanz der Session und Zuweisen zu einer Session-Variable. Das finde
ich aber nicht so elegant, weil ich dann überall in der Anwendung erst
einmal die Instanz wieder aus der Session-Variable in eine lokale
Objektvariable auslesen muss und erst danach auf die Properties
zurückgreifen kann. Ich möchte die oben beschriebene Methode einfach
*verstehen*. Schließlich soll es theoretisch ja genau so funktionieren.



Also "Eleganz" liegt ja nun, wie man sieht, im Auge des
Betrachters.

Wie du das über ne Session machen kannst hab ich hier kürzlich
schonmal geschrieben:

news://news.microsoft.com:119/#
(15.02.2008 20:10, Re: global.asax verwenden?, Topic: global.asax
verwenden? von Andreas Mahub).

Gruß, Thomas [MVP ASP/ASP.NET]
http://www.69grad.de - Beratung, Entwicklung
http://www.dotnetjob.de - .NET-Stellenbörse
https://www.xing.com/net/asp.net/ - ASP.NET bei XING
http://blog.thomasbandt.de - Thomas goes .NET

Ähnliche fragen