Loggare il ricliclo dell'Application Domain

Print Content | More

Nello sviluppare Dexter ho avuto diversi problemi con la cache che, per cause non mie, non ne voleva sapere di andare, al contrario di quello che succede nell’ambiente di sviluppo dove funziona alla grande.

Nello specifico il problema consiste nel fatto che, spesso, gli oggetti inseriti precedentemente in cache risultano nulli, venendo quindi rimossi.

I motivi per cui un oggetto può essere rimosso dalla cache sono decisamente pochi:

  • rimozione manuale tramite codice;
  • Shoutdown causa riciclo o crash del worlprocess;
  • fine della memoria disponibile.

Dato che sono certo di non aver svuotato la cache via codice J, la ricerca del problema si è subito spostata sulla seconda ipotesi, e mi son messo a loggare lo shoutdown lato applicativo, non avendo accesso al server.

Sfortunatamente questa non è cosa semplice perchè non è detto che il WorkProcess non venga “killato” manualmente sul server, oppure che un’altra applicazione presente all’interno dello stesso application pool non provochi un’eccezione che termini il processo.

ScottGu, nel suo blog, propone una possibile soluzione che consiste nell’invocare via reflection i metodi _shutDownMessage e _shutDownStack, che forniscono tutte le informazioni per capire il motivo che ha scatenato lo shoutdown, come mostrato di seguito.

public void Application_End()
{

    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",BindingFlags.NonPublic| BindingFlags.Static| BindingFlags.GetField,null,null,null);

    if (runtime == null)
        return;

    string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage",BindingFlags.NonPublic| BindingFlags.Instance| BindingFlags.GetField,null,runtime,null);

    string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack",BindingFlags.NonPublic| BindingFlags.Instance| BindingFlags.GetField,null,runtime,null);
    
    Logger.Error(shutDownMessage, shutDownStack);
}

Maggiori info le trovate qui.


.NET , ASP.NET , Dexter , IIS

2 comments

Related Post

  1. #1 da Maurizio Tammacco Tuesday September 2009 alle 12:47

    Ho utilizzato anche io questa tecnica in una applicazione da un cliente che soffriva di imprevisti shutdown dell'app domain.
    Ho notato che i messaggi sono piuttosto generici, tipo "configuration changed" oppure "application pool recycle".
    Nel mio caso ciò che faceva schiantare l'application domain era una eccezione sollevata dal codice contenuto in un blocco catch, ovvero eccezione su eccezione :-)

  2. #2 da Ugo Lattanzi Tuesday September 2009 alle 12:47

    Ciao Maurizio,
    confermo che i messaggi non sono un granchè.
    Il top sarebbe avere accesso al server per attaccare il debugger di IIS ed avere un dump della memoria nell’esatto momento in cui l'AppDomain va giù, ma mi rendo conto che spesso non è fattibile come cosa.
    Cmq per loggare eventi, stato, errori, ecc in un'applicazione web ritengo che l'HelathMonitoring rimanga la soluzione migliore.

    Ciauz

The comments for this post are closed.

  1. There is no TrackBack for this post.