expertenaustausch > microsoft.* > microsoft.german.entwickler.dotnet.asp

Marco von Frieling (21.02.2007, 20:47)
Hallo.

Ich habe einige statische Properties die den aktuellen HttpContext
benötigen (typisierte Zugriffe auf Session-, Application- und
Cacheinhalte). Jedoch liefert HttpContext.Current in dieses Properties
ständig null, warum? Diese Properties werden während OnLoad und
OnPreRender verwendet, wo an sich ja ein Context vorhanden sein muss.

Gruß, Marco
Thomas Bandt (21.02.2007, 21:32)
Marco von Frieling schrieb:
> Hallo.
> Ich habe einige statische Properties die den aktuellen HttpContext
> benötigen (typisierte Zugriffe auf Session-, Application- und
> Cacheinhalte). Jedoch liefert HttpContext.Current in dieses Properties
> ständig null, warum? Diese Properties werden während OnLoad und
> OnPreRender verwendet, wo an sich ja ein Context vorhanden sein muss.


Baue mal ein Sample, und stelle das online.
Marco von Frieling (21.02.2007, 23:07)
Hallo Thomas Bandt schrieb:
> Baue mal ein Sample, und stelle das online.

Im Sample funktionierts natürlich problemlos. In meiner schon größeren
Anwendung sehe ich es aber daran, dass bestimmte Dateien bei jedem
Seitenaufruf von der Platte geladen werden anstatt aus dem Cache
genommen, an einer anderen Stelle wo ich den Zugriff noch nicht in einem
try..catch habe, weil der Debugger dort mit einer NullReferenceException
auf HttpContext.Current.Cache stehen bleibt...
Stefan Falz (21.02.2007, 23:30)
Hallo Marco,

"Marco von Frieling" schrieb:

> Ich habe einige statische Properties die den aktuellen HttpContext
> benötigen (typisierte Zugriffe auf Session-, Application- und
> Cacheinhalte). Jedoch liefert HttpContext.Current in dieses Properties
> ständig null, warum?


Poste doch bitte mal Beispielcode. Oder stell das komplette Beispiel online und
beschreib mal genauer, unter welchen Umständen das nicht funktioniert. Wenns in
einem reduzierten Beispiel klappt, liegt es nicht an ASP.NET, sondern mit
Sicherheit an deiner Anwendung. Gerade bei statischen Properties kann es da im
Multiuserbetrieb schon mal zu Problemen kommen (die aber so gut wie immer
hausgemacht sind, was ich schon selbst leidvoll erfahren durfte^^)
Thomas Bandt (21.02.2007, 23:51)
Marco von Frieling schrieb:
> Hallo Thomas Bandt schrieb:
> Im Sample funktionierts natürlich problemlos. In meiner schon größeren
> Anwendung sehe ich es aber daran, dass bestimmte Dateien bei jedem
> Seitenaufruf von der Platte geladen werden anstatt aus dem Cache
> genommen, an einer anderen Stelle wo ich den Zugriff noch nicht in einem
> try..catch habe, weil der Debugger dort mit einer NullReferenceException
> auf HttpContext.Current.Cache stehen bleibt...


Tja, leider kann ich die Ursache aber nicht riechen ... tut mir leid :-).
Henry Habermacher [MVP Access] (22.02.2007, 07:49)
Hallo Marco

quoting Marco von Frieling:
> genommen, an einer anderen Stelle wo ich den Zugriff noch nicht in
> einem try..catch habe, weil der Debugger dort mit einer
> NullReferenceException auf HttpContext.Current.Cache stehen bleibt...


Was genau steht in dieser Zeile und wo genau wird diese aufgerufen, in
welchem Ereignis.

Gruss
Henry
Marco von Frieling (22.02.2007, 13:42)
Hallo Thomas,
>> an einer Stelle wo ich den Zugriff noch nicht in
>> einem try..catch habe, weil der Debugger dort mit einer
>> NullReferenceException auf HttpContext.Current.Cache stehen bleibt...

> Tja, leider kann ich die Ursache aber nicht riechen ... tut mir leid :-).


Ich hab die Ursache mittlerweile gefunden. Und zwar wollte ich gewisse
Daten (die mit einer Dependency versehen sind), bei Änderung des
Quellobjektes sofort im Cache aktualisieren, habe allerdings nicht
beachtet, dass das CacheItemRemoved Ereignis in einem anderen Thread
ausgeführt wird, wo natürlich kein Context vorhanden ist. Verwirrt hat
mich nämlich, dass die Exception sehr schnell nach dem Starten der
Anwendung (und auch des WebServers) auftritt. Ein paar geänderte und
zusätzliche Logging-Ausgaben haben nun folgendes gezeigt:

Das betroffene Objekt wird manchmal ca. 20 Sekunden nachdem die
Anwendung gestartet und das Objekt in den Cache eingefügt wurde (der
WebServer wurde unmittelbar zuvor neugestartet), wieder entfernt,
Reason: Underused.

Eingefügt habe ich es mit einer Sliding-Expiration von 2 Stunden.

Gruß,
Marco
Harald M. Genauck (22.02.2007, 14:55)
Hallo Marco,

[..]
> gestartet und das Objekt in den Cache eingefügt wurde (der WebServer
> wurde unmittelbar zuvor neugestartet), wieder entfernt, Reason:
> Underused.


Was brauchst Du denn aus dem Context? Auf manches lässt sich auch anders
zugreifen...

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic (Herausgeber)
"visual studio one" - (Chefredakteur)
Marco von Frieling (23.02.2007, 13:59)
Hallo Harald,
> Was brauchst Du denn aus dem Context? Auf manches lässt sich auch anders
> zugreifen...


Beispiel??

Ich brauche den Cache.

Gruß,
Marco
Harald M. Genauck (23.02.2007, 16:01)
Hallo Marco,

>> Was brauchst Du denn aus dem Context? Auf manches lässt sich auch anders
>> zugreifen...


> Beispiel??
> Ich brauche den Cache.


Da hast Du Glück - den bekommst Du jederzeit und überall über:

System.Web.Hosting.HostingEnvironment.Cache

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic (Herausgeber)
"visual studio one" - (Chefredakteur)
Marco von Frieling (24.02.2007, 14:03)
Hallo Harald,
> Da hast Du Glück - den bekommst Du jederzeit und überall über:
> System.Web.Hosting.HostingEnvironment.Cache


Danke. Das ist gut zu wissen, und in der MSDN steht es auch nicht. Da
steht nur (in der Beschreibung von System.Web.Caching.Cache):

"One instance of this class is created per application domain, and it
remains valid as long as the application domain remains active.
Information about an instance of this class is available through the
Cache property of the HttpContext object or the Cache property of the
Page object."

Und wenn man die HostingEnvironment Klasse nicht kennt, ist das nicht zu
finden.

Gruß,
Marco
Harald M. Genauck (25.02.2007, 14:15)
Hallo Marco,

>> Da hast Du Glück - den bekommst Du jederzeit und überall über:
>> System.Web.Hosting.HostingEnvironment.Cache


> Danke. Das ist gut zu wissen, und in der MSDN steht es auch nicht. Da
> steht nur (in der Beschreibung von System.Web.Caching.Cache):
> "One instance of this class is created per application domain, and it
> remains valid as long as the application domain remains active.
> Information about an instance of this class is available through the
> Cache property of the HttpContext object or the Cache property of the
> Page object."
> Und wenn man die HostingEnvironment Klasse nicht kennt, ist das nicht zu
> finden.


Es lohnt sich absolut, den System.Web.Namespace einfach mal so neugierig zu
durchstöbern...
;-)

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic (Herausgeber)
"visual studio one" - (Chefredakteur)
Ähnliche Themen