Pergunta

É possível pegar um evento de reciclagem no global.asax?

Eu sei Application_End será acionado, mas há uma maneira de saber que foi desencadeada por uma reciclagem do pool de aplicativos?

thx, Lieven Cardoen aka Johlero

Foi útil?

Solução

Então, aqui está uma idéia de como isso poderia funcionar.

Com base na minha anterior resposta (anexar a AppDomain.CurrentDomain.ProcessExit) e stephbu 's comentário:

processo Esta armadilha vontade mais estruturado teardowns v.g. - mas não tenho certeza de que ele irá interceptar todas as lágrima downs. por exemplo. http://blogs.msdn.com/ jmstall / Arquivo / 2006/11/26 / processo-saída-event.aspx Processo de reciclagem vai matar o processo se ele parece ser pendurado - o manipulador não são chamados.

Eu sugiro seguinte estratégia:

No manipulador (regular) ProcessExit (que supomos não será chamado em uma reciclagem do pool de aplicativos), escrever algum arquivo no disco como "app_domain_end_ok.tmp".

Em seguida, no Application_Start do seu check global.asax para este arquivo. Se ele não existir, é um sinal de que a aplicação não foi encerrado em uma maneira limpa (ou que é a primeira vez que começou). Não se esqueça de apagar este arquivo do disco após a verificação.

Eu não tentei isso sozinho, mas pode valer a pena tentar.

Outras dicas

Eu encontrei este artigo sobre blog de Scott Guthrie :

Registro ASP.NET Aplicação de desligamento Eventos

Alguém em um listserv pediu recentemente se havia uma maneira de descobrir por que e quando ASP.NET reinicia domínios de aplicação. Especificamente, ele estava procurando a causa exata da o que estava provocando-los em seu aplicação em uma produção compartilhada ambiente hospedado (era um alteração de arquivo web.config, um global.asax mudança, uma mudança de diretório App_Code, uma mudança de exclusão do diretório, max-num-compilações atingiu contingente, \ Mudança bin, etc).

Thomas na minha equipe tem um frio trecho de código que ele escreveu que os usos alguns bacana truques reflexão privadas para capturar e registrar essas informações. É muito fácil de re-uso e add em toda a aplicação, e podem ser utilizados para registrar a qualquer informação que você quer (o código abaixo usar o evento NT Log para salvá-lo - mas você poderia apenas como facilmente enviá-lo para um banco de dados ou através de um enviar e-mail para um administrador). As obras de código tanto com ASP.NET V1.1 e ASP.NET V2.0.

Basta adicionar o System.Reflection e System.Diagnostics namespaces para o seu Global.asax classe / arquivo, e depois adicionar o evento Application_End com 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);
}

Eu nunca tentei isso mesmo, mas você poderia tentar anexar um manipulador de eventos para o evento ProcessExit do AppDomain.

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

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

Espero que isso ajude!

Eu estava muito mais bem sucedido com anexar ao evento DomainUnload, ele é acionado em AppPool reciclagem e paralisação da própria AppPool.

AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top