Alessio Pambianchi

ASP.NET AJAX ricerche-condivisione
posts - 39, comments - 1303, trackbacks - 1

Piccola escursione su *HttpResponse.End()* & *ThreadAbortException*

E' chiaro che questo problema abbia avuto ben più importanti contributi, e ben più importanti oratori (visto il materiale "googleiano"), comunque essendomi trovato anche io in queste acque pantanose, vorrei dire la mia (scusatemi se è poco ;) ), anche in funzione di un *Post Pro Memoria*.

In questo ultimo periodo di lavoro mi sto occupando di un progetto Web abbastanza complesso che nel Front End fa un uso massivo di gridview. per migliorare la User Experience, è stato introdotto un controllo custom chiamato *YuiGrid* appartenente alla libreria ExtJs Extender Controls (codeplex), l'integrazione del controllo è stata abbastanza semplice, e *quasi* si stava per gioire, ma una controllata veloce ai log prodotti dall'aplpicazione evidenzia una serie di ThreadAbortException, generate ogni volta che sul controllo *YuiGrid* vengono premuti i bottoni first, prev, next, last naturalmente questi appartenenti alla logica della paginazione. Meglio ancora, le eccezioni vengono sollevate ogni volta che viene eseguito il metodo DataBind del controllo, che a sua volta è chiamato in corrispondenza degli eventi legati alla paginazione, e ancora più nel dettaglio l'eccezione viene sollevata solo dopo la prima load della pagina.

Analizzando il codice sorgente del controllo ho trovato le cause del problema:

//EnsureChildControls();
HttpResponse Response = HttpContext.Current.Response;
Response.Clear();
//Response.ContentType = "text";
//JavaScriptSerializer ser = new JavaScriptSerializer();
Response.Write("{\"records\":[" + parsedValue + "],\"totalCount\":\"" + this.TotalRecords + "\"}");
Response.End();

E' noto che la funzione *HttpResponse.End()* generi questo tipo di eccezione come documentato su MSDN, di conseguenza mi sono mosso per vedere come correggere l'errore, dopo alcuni test, ed un po di debug ecco la soluzione:

//EnsureChildControls();
HttpResponse Response = HttpContext.Current.Response;
Response.Clear();
//Response.ContentType = "text";
//JavaScriptSerializer ser = new JavaScriptSerializer();
Response.Write("{\"records\":[" + parsedValue + "],\"totalCount\":\"" + this.TotalRecords + "\"}");
//Response.End();
Response.Flush();
Response.Close();
return;

Naturalmente sono fortunato, ho a disposizione il codice sorgente del controllo, vorrei aggiungere anche che per lo stesso problema ho trovato differenti soluzioni ma non tutte lo risolvono, per cui come sempre provare provare provare.

Tags:

Print | posted on martedì 22 luglio 2008 14:01 | Filed Under [ ASP.NET AJAX ]

Powered by:
Powered By Subtext Powered By ASP.NET