He encontrado este artículo en el blog de de Scott Guthrie:
Logging ASP.NET Application Shutdown Events
Alguien en una lista de correo electrónico recientemente pidió si había una manera de averiguar qué y cuando ASP.NET se reinicia dominios de aplicación. En concreto, buscaba la causa exacta de lo que se les desencadenando en su solicitud en un entorno alojado producción compartida (que era un cambio de archivo web.config , un cambio global.asax , un cambio de directorio App_Code, un cambio de eliminación de directorio, número máximo de compilaciones alcanzó cuota, \ bin cambio de directorio, etc.).
Thomas en mi equipo tiene un lugar fresco código fragmento que escribió que los usos algunos trucos ingeniosos reflexión privadas para capturar y registrar esta información. Es bastante fácil de reutilizar y añadir en cualquier aplicación, y se puede utilizar para registrar la información en cualquier lugar que falta (el siguiente código utiliza el NT Evento registro para guardarlo - pero podría ser tan sólo facilidad enviarlo a una base de datos o a través de un correo electrónico a un administrador). El código funciona con ASP.NET V1.1 y ASP.NET V2.0.
sólo tiene que añadir System.Reflection y System.Diagnostics espacios de nombres a su clase /archivo Global.asax, a continuación, agregue el evento Application_End con este código:
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);
if (!EventLog.SourceExists(".NET Runtime")) {
EventLog.CreateEventSource(".NET Runtime", "Application");
}
EventLog log = new EventLog();
log.Source = ".NET Runtime";
log.WriteEntry(String.Format(
"\r\n\r\n_shutDownMessage={0}\r\n\r\n_shutDownStack={1}",
shutDownMessage, shutDownStack),
EventLogEntryType.Error);
}
Aplicación de reciclaje puede ser un asunto muy brutal en función del estado de su proceso - peor escenario es Win32 :: TerminateProcess que se llama. No hay forma de atrapar tal resultado en su proceso. ¿Qué estás intentando lograr? Enjuagar un poco el estado? – stephbu