Возможно ли поймать событие рециркуляции в global.asax?IIS Recycle Global.asax
Я знаю, что Application_End будет запущен, но есть ли способ узнать, что он был вызван переработкой пула приложений?
ТНХ, Ливен Cardoen ака Johlero
Возможно ли поймать событие рециркуляции в global.asax?IIS Recycle Global.asax
Я знаю, что Application_End будет запущен, но есть ли способ узнать, что он был вызван переработкой пула приложений?
ТНХ, Ливен Cardoen ака Johlero
Итак, вот идея, как это могло бы работать.
Основываясь на моем previous answer (прикрепляются к AppDomain.CurrentDomain.ProcessExit) и stephbu «s комментарий:
Это будет ловушкой наиболее структурированный процесс например разборка - но я не уверен, что поймает все срывы. например http://blogs.msdn.com/jmstall/archive/2006/11/26/process-exit-event.aspx Процесс утилизации убьет процесс , если он, кажется, повесил - ваш обработчик не получил бы вызов.
Я предлагаю следующую стратегию:
В обработчике (регулярный) ProcessExit (который мы предполагаем, не будет называть по утилизации пула приложений), написать какой-либо файл на диск как «app_domain_end_ok.tmp
».
Затем в Application_Start вашей проверки global.asax для этого файла. Если он не существует, это признак того, что приложение не было прекращено чистым способом (или что это первый раз, когда он начинался). Не забудьте удалить этот файл с диска после проверки.
Я сам не пробовал, но это может стоить попробовать.
Спасибо @splattne за кредит ... – stephbu 2008-11-17 17:21:02
Я никогда не пробовал это сам, но вы можете попробовать присоединить обработчик события к ProcessExit случае AppDomain.
...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...
void OnExit(object sender, EventArgs e) {
// do something
}
Надеюсь, это поможет!
Это замалчивает большинство структурированных отрывных процессов процесса, например. - но я не уверен, что это уловит все срывы. , например. http://blogs.msdn.com/jmstall/archive/2006/11/26/process-exit-event.aspx Процесс утилизации убьет процесс, если он, кажется, повесился - ваш обработчик не будет вызван. – stephbu 2008-11-16 17:37:30
Я нашел эту статью в блоге Скотт Guthries в:
Logging ASP.NET Application Shutdown Events
Кто на листсерв недавно спросил , есть ли способ, чтобы выяснить, почему и когда ASP.NET перезапускается доменов приложений. В частности, он искал точную причину что пусковым их на его применения в производственной совместно среде хостинга (было это изменение файла web.config, изменение global.asax , изменения каталога App_Code, каталог delete change, max-num-compilations достигнут квоты, \ bin изменение каталога и т. Д.).
Томас в моей команде есть классный код-фрагмент, что он писал, что использует некоторые изящные частные приемы отражения , чтобы захватить и войти эту информацию. Это довольно легко использовать повторно и добавить в любое приложение, и может быть использовано для регистрации информации в любом месте вы покупке (код ниже использовать NT Event журнал, чтобы сохранить его, - но вы могли бы так же, как легко отправьте его в базу данных или через адрес электронной почты ). Код работает с ASP.NET V1.1 и ASP.NET V2.0.
Просто добавьте System.Reflection и system.diagnostics пространств имен для вашего Global.asax класс/файл, а затем добавить событие Application_End с этим кодом:
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);
}
Я был очень более успешным с присоединением к событию DomainUnload, он запускается при утилизации AppPool и остановке самого AppPool.
AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;
App корзина может быть довольно жестокое делом в зависимости от состояния вашего процесса - худший сценарий Win32 :: TerminateProcess вызывается. Невозможно уловить такой результат в вашем процессе. Чего вы пытаетесь достичь? Промывка какого-то состояния? – stephbu 2008-11-16 17:57:35