Loggare il ricliclo dell'Application Domain

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.


Comments