Вопрос

Можно ли отловить событие переработки в файле global.asax?

Я знаю, что Application_End будет запущен, но есть ли способ узнать, что он был вызван перезапуском пула приложений?

спасибо, Ливен Кардоен, он же Джохлеро

Это было полезно?

Решение

Итак, вот идея, как это могло бы работать.

На основании моих предыдущего ответа (прикрепить к AppDomain.CurrentDomain.ProcessExit) и Комментарий stephbu :

  

Это заманивает в ловушку наиболее структурированный процесс   например, демонтаж - но я не уверен, что   это подстерегает все разрушения. например    http://blogs.msdn.com/ jmstall / Архив / 2006/11/26 / процесс-выход-event.aspx   Процесс перезапуска убьет процесс   если кажется виснет - твой обработчик   не будет вызван.

Я предлагаю следующую стратегию:

В (обычном) обработчике ProcessExit (который, как мы предполагаем, не будет вызываться при повторной обработке пула приложений), запишите какой-нибудь файл на диск, например " app_domain_end_ok.tmp ".

Затем в Application_Start вашего global.asax проверьте этот файл. Если это не существует, это признак того, что приложение не было завершено чистым способом (или это - первый раз, когда это запустилось). Не забудьте удалить этот файл с диска после проверки.

Я сам не пробовал, но стоит попробовать.

Другие советы

Я нашел эту статью на Блог Скотта Гатриса:

Регистрация событий завершения работы приложения ASP.NET

Кто-то на listserv недавно спросил был ли способ выяснить Meme it почему и когда перезапускается ASP.NET прикладные домены.В частности, он искал точную причину Meme it что вызвало их на его Meme it применение в совместном производстве размещенная среда (было ли это изменение файла web.config, глобальный.asax change, изменение каталога app_code, изменение директории удалить, max-num-compilations достигли квоты, изменить каталог \bin и т.д.).

Томас в моей команде имеет прохладный код-фрагмент, который он написал, который использует некоторые изящные частные отражения трюки для сбора и регистрации этой информации.Это довольно легко повторно использовать и добавить в любое приложение, и может быть использован записывать информацию в любом месте вы want (в приведенном ниже коде используется событие NT Войдите, чтобы сохранить его – но вы можете так же, как легко отправить его в базу данных или через по электронной почте администратору).Код работает с 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);
}

Я никогда не пробовал это сам, но вы можете попытаться присоединить обработчик событий к событию ProcessExit в AppDomain.

...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...

void OnExit(object sender, EventArgs e) {
    // do something
}

Надеюсь, это поможет!

Я был гораздо более успешным с подключением к событию DomainUnload, оно запускается при перезапуске AppPool и остановке самого AppPool.

AppDomain.CurrentDomain.DomainUnload + = this.CurrentDomainOnProcessExit;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top