193 messaggi dal 02 novembre 2010
Ciao a tutti.
Ho un problema assurdo che non riesco a gestire.

La mia pagina ASP.NET viene eseguita e caricata correttamente; tant'è che raggiunge ed esegue correttamente anche l'evento LoadComplete (vuoto perché in realtà non mi serve se non per il debug in questo caso) per vedere se ci fossero degli errori nell'esecuzione.

Niente viene eseguita e caricata correttamente.
Subito dopo il caricamento però il VisualStudio si blocca e mi segnala l'errore StackOverflowException segnalandomi un qualche loop infinito.

Adesso quello che non riesco a capire è come possa darmi un errore del genere a pagina completata? Posso utilizzare una qualche altro evento dove poter controllare dove si ferma ancora?
10.286 messaggi dal 09 febbraio 2002
Contributi
Ciao,
quando Visual Studio si blocca per segnalarti l'eccezione, dovrebbe apparirti una schermata
come questa o come questa.

Clicca "View details" e avrai delle informazioni aggiuntive, tra cui lo Stack Trace, ovvero la sequenza di chiamate che hanno portato al verificarsi dell'eccezione. Lì in mezzo dovresti trovare il numero della riga di codice incriminata.

Puoi vedere lo stack trace anche in un apposito riquadro di Visual Studio, come vedi qui:
https://msdnshared.blob.core.windows.net/media/2017/04/10-debugging-1024x677.png

ciao,
Moreno

Enjoy learning and just keep making
193 messaggi dal 02 novembre 2010
Ciao Moreno, grazie intanto della risposta.

La questione abbastanza curiosa è che cliccando su View Detail, lui mi mostra semplicemente System.StackOverflowException, come si evince dallo screenshot.

https://www.flickr.com/photos/160540205@N07/38557227576/in/dateposted-public/

Inoltre anche lo stack non sembra darmi indicazioni https://www.flickr.com/photos/160540205@N07/26837725949/in/dateposted-public/


Non riesco proprio a capire cosa stia succedendo
10.286 messaggi dal 09 febbraio 2002
Contributi
Ciao,
prova a scendere un po' nello stack delle chiamate, magari viene fuori qualche informazione interessante. Trattandosi di una StackOverflowException, è normale che ci siano parecchie voci duplicate.

Comunque penso che la questione sia chiara: il serializzatore non riesce a completare il lavoro perché gli stai passando un oggetto che attraverso una sua proprietà referenzia un altro oggetto, che a sua volta referenzia il primo oggetto. Di che richiesta si tratta, è un Web Method? E' una chiamata ad un'action di Web API? E' un servizio WCF?

Prendi un caso del genere:
public class Person {
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string Address Address { get; set; }
}

public class Address {
  public string Street { get; set; }
  public string City { get; set; }
  public string Person Person { get; set; }
}


Come vedi, la classe Person ha una proprietà di tipo Address, che a sua volta ha una proprietà di tipo Person. Provando a serializzare un grafo in cui sono coinvolti due oggetti che si referenziano l'un l'altro, il loop diventa infinito e causa appunto una StackOverflowException.

Se stai restituendo al client delle entità che usi con Entity Framework, considera l'idea di crearti dei Dto e di restituire quelli, anziché le entità stesse.
In alternativa, puoi ignorare le proprietà che non intendi serializzare, come per esempio la proprietà Person sulla classe Address. In questo caso, prova ad usare l'attributo IgnoreDataMember.

public class Address {
  public string Street { get; set; }
  public string City { get; set; }
  [IgnoreDataMember]
  public string Person Person { get; set; }
}


ciao,
Moreno
Modificato da BrightSoul il 24 novembre 2017 14.05 -

Enjoy learning and just keep making
193 messaggi dal 02 novembre 2010
Purtroppo lo Stack non mi è molto di aiuto perché in fondo mi mostra:

"The maximum number of stack frames supported by Visual Studio has been exceeded."

Inoltre ho controllato se per caso ci fosse qualche istanza che ne refernziasse un'altra come da te indicato, ma non mi risultano, tra l'altro il codice compone l'HTML in uscita, se questo HTML non lo sparo a video l'errore non si presenta; credo che se ci fosse quella sorta di "autoreferenziazione" avrei avuto lo stesso problema anche senza mostrare a video l'HTML.

La cosa piuttosto balorda è però che l'errore sul visual studio si presenta dopo aver completato il caricamento della pagina.

Dal basso della mia competenza mi viene da pensare che ci sia qualcosa a livello di Rendering che prosegue dopo il Load_Complete della pagina che fa si che il software vada in crash; anche perchè ho messo i Try-Catch dappertutto e nessuno mi cattura l'errore.

Non so dove sbattere ulteriormente la testa.
193 messaggi dal 02 novembre 2010
Aggiungo ancora una cosa.
Ho provato ad intromettermi anche nel Page_UnLoad event che sarebbe l'ultimo step se non sbaglio del ciclo di vita; ebben l'errore si manifesta addirittura dopo quest'evento.
10.286 messaggi dal 09 febbraio 2002
Contributi

Ho provato ad intromettermi anche nel Page_UnLoad event che sarebbe l'ultimo step se non sbaglio del ciclo di vita; ebben l'errore si manifesta addirittura dopo quest'evento


Certamente, dev'essere che la tua pagina sta invocando un PageMethod via Ajax. Vai a vedere nella scheda "Network" (o "Rete") degli strumenti di sviluppo del tuo browser (tasto F12) per vedere che richiesta ajax viene inviata al server. Da lì puoi capire quale sia il Page Method incriminato.

Ripeto, qui il problema riguarda la serializzazione di un oggetto in JSON (o XML), non di contenuto HTML.

ciao,
Moreno
Modificato da BrightSoul il 24 novembre 2017 19.13 -

Enjoy learning and just keep making
24 messaggi dal 01 febbraio 2017
Seguo la discussione con interesse, poichè ho un problema di blocco con un servizio WCF, al limite se nn risolvo, apro un nuovo Topic.
;-)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.