[ASP.NET] Application[] zegt invalid cast?

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Om wat CPU cycles en database-queries te besparen gooi ik een object in Application[] zodat het in leven blijft tussen verschillende requests door. Maar nu "opeens" wordt ik geconfronteerd met dat mijn object niet meer naar de juiste class gecast kan worden.

Ik zet een object van het type CachedStats in Application["stats"]. Bij een volgende request haal ik het er weer uit:
C#:
1
CachedStats stats = (CachedStats) Application["stats"];

Daar krijg ik de error Unable to cast object of type 'CachedStats' to type 'CachedStats'. :?

CachedStats heb ik zelf gemaakt, het is een 'complex' object met een collection van weer andere objectjes. Allemaal erg triviaal, dat wel. En er zitten uiteraard een paar methodjes in.

Ik dus gelijk kijken met de debugger wat Application["stats"] dan wél is, maar het blijkt inderdaad gewoon een CachedStats ding te zijn... maar toch wil ie zichzelf niet laten casten. Waarom niet? Uiteraars heb ik die Application["stats"] al leeggemaakt zodat het niet een verouderde versie van de class kan zijn. Maar niks mocht baten...

Hoe los ik dit op? Of kan ik het beter op een hele andere manier doen?

/edit
Ik heb inmiddels ook het Cache object geprobeerd, die is misschien ook beter voor wat ik wil bereiken, maar het geeft nog steeds dezelfde InvalidCastException wanneer ik de stats opvraag uit de cache :'(

/edit2
Nou, ik kan jullie vertellen dat een int[] opslaan wel werkt, hetgeen in principe mijn idee laat werken, maar niet echt een briljante oplossing is. Een zelf verzonnen object moet er toch ook in kunnen, of zie ik dat nou verkeerd :?

[ Voor 35% gewijzigd door _Thanatos_ op 04-04-2006 21:11 ]

日本!🎌


  • Daspeed
  • Registratie: Maart 2001
  • Nu online
In welk project/assembly heb je de klasse CachedStats gezet? En lees en schrijf je naar het application object vanuit dezelfde assembly?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Is gewoon een doodnormale website, zelfde assembly dus.

Het is niet eens een website eigenlijk... het is m'n usericon :)

[ Voor 39% gewijzigd door _Thanatos_ op 04-04-2006 22:02 ]

日本!🎌


  • Daspeed
  • Registratie: Maart 2001
  • Nu online
_Thanatos_ schreef op dinsdag 04 april 2006 @ 22:02:
Is gewoon een doodnormale website, zelfde assembly dus.

Het is niet eens een website eigenlijk... het is m'n usericon :)
Hmm, das wel vreemd dan idd :P
heb je al eens een totale rebuild gedaan en iis gereset? (zodat je Application object sowieso leeg is)

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 22-02 20:26
Schijnt een bug in .NET 2.0 te zijn als ik diverse website moet geloven, als ik de probleemomschrijving vergelijk. Enige oplossing to nu toe, ervoor zorgen dat je applicatie helemaal ververst wordt.

Zie ook: ASP.NET 2.0 - Your car is no longer a car, Unable to cast object of type 'ASP.masterpage_master' to type 'ASP.masterpage_master'.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Rebuild, reset, restart, helpt allemaal niet. Hij blijft volhouden.

Ik denk ook niet dat het probleem "your car is no longer a car" hetzelfde is. Het gebeurt gewoon tijdens het runnen:

1) Schone IIS met m'n website erop.
2) Doe een request -> objectje vliegt naar de cache
3) Nog een request -> objectje haalt ie uit de cache
4) Nog een request -> objectje in cache is opeens verkeerde type.
5) Nog een request -> objectje in cache is nog steeds verkeerde type.
6) etc.

Ik hoef toch niet op een productieomgeving een rebuild te gaan doen? En wat als ik helemaal niet compileer, maar de source upload en het aan ASP.NET over wil laten?

[ Voor 6% gewijzigd door _Thanatos_ op 04-04-2006 22:23 ]

日本!🎌


  • Daspeed
  • Registratie: Maart 2001
  • Nu online
Doet hetzelfde probleem zich voor als je in een nieuw project dezelfde klasse in het application object zet en weer terug cast?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
dit *is* een nieuw project, dus strikt genomen heb ik dat al gedaan ;) maar nóg een nieuw project heeft natuurlijk geen weet van die CachedStats class en kan er dus ook niets mee. Bovendien heeft ie een andere Application collection, omdat het ook een andere ASP.NET applicatie zal zijn.

日本!🎌


  • Daspeed
  • Registratie: Maart 2001
  • Nu online
_Thanatos_ schreef op dinsdag 04 april 2006 @ 22:34:
dit *is* een nieuw project, dus strikt genomen heb ik dat al gedaan ;) maar nóg een nieuw project heeft natuurlijk geen weet van die CachedStats class en kan er dus ook niets mee. Bovendien heeft ie een andere Application collection, omdat het ook een andere ASP.NET applicatie zal zijn.
Mjah ik bedoel eigenlijk dat je die klasse ook in het nieuwe project meeneemt, om zo te kijken of in een 'cleane' omgeving hetzelfde probleem optreedt.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:35

gorgi_19

Kruimeltjes zijn weer op :9

Weet je zeker dat je hem nergens overschrijft, of een andere folder er mee zit te etteren? Heb je al geprobeerd om een try-catch te maken en in de catch bij errors een soortement van debug dump te maken, met onder andere het type er in?
En sowieso: heb je al gekeken naar Cache ipv application? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Ik denk dat ik het probleem al begrijp... MS heeft een grove fout gemaakt in hoe casting wordt gecontroleerd. Als je een object in de cache, in de application, of zelfs in de session zet, dan is dat bijvoorbeeld type A uit assembly A.

Ga je nou je applicatie aanpassen en dus opnieuw compileren, dan wordt je webapplicatie een nieuwe DLL. En je object dat nog steeds braaf in de cache, application of session leeft, is nog steeds van type A uit assembly A, terwijl je webapplicatie assembly B is, en daardoor type A uit assembly B verwacht.

De FullName properties van GetType() methodes zijn gelijk, maar de assemblies niet, volgens het Immediate window:
code:
1
2
3
4
stats.GetType().AssemblyQualifiedName
"index+Stats, App_Web__7cl003r, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
typeof(Stats).AssemblyQualifiedName
"index+Stats, App_Web_jdpdan8m, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"

Misschien hadden ze daar iets beter over na moeten denken, want écht handig? Neuh, dat niet...

[ Voor 4% gewijzigd door _Thanatos_ op 05-04-2006 22:23 ]

日本!🎌


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:35

gorgi_19

Kruimeltjes zijn weer op :9

_Thanatos_ schreef op woensdag 05 april 2006 @ 22:10:
Ik denk dat ik het probleem al begrijp... MS heeft een grove fout gemaakt in hoe casting wordt gecontroleerd. Als je een object in de cache, in de application, of zelfs in de session zet, dan is dat bijvoorbeeld type A uit assembly A.

Ga je nou je applicatie aanpassen en dus opnieuw compileren, dan wordt je webapplicatie een nieuwe DLL. En je object dat nog steeds braaf in de cache, application of session leeft, is nog steeds van type A uit assembly A, terwijl je webapplicatie assembly B is, en daardoor type A uit assembly B verwacht.

De FullName properties van GetType() methodes zijn gelijk, maar de assemblies niet, volgens het Immediate window:
code:
1
2
3
4
stats.GetType().AssemblyQualifiedName
"index+Stats, App_Web__7cl003r, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
typeof(Stats).AssemblyQualifiedName
"index+Stats, App_Web_jdpdan8m, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"

Misschien hadden ze daar iets beter over na moeten denken, want écht handig? Neuh, dat niet...
:?
Een cache overleefd een recompile niet.
Application wellicht, maar cache sowieso niet :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Toch overleeft ie em wel... het is echt keer op keer te reproduceren.

Dus wat ik nu doe, heel simpel eigenlijk:
C#:
1
2
3
4
object stats = Cache["Stats"];
if (stats != null && stats is Stats) {
   //...
}

Dat krijg je in elk geval geen errors na een recompile :)

日本!🎌


Verwijderd

Het gedrag van de cache kun je toch ergens instellen? (wellicht in je code?)
Pagina: 1