Pergunta

Como posso determinar programaticamente se Elmah está ativado?

Foi útil?

Solução

Porque:

O Elmah pode ser adicionado dinamicamente a um aplicativo Web ASP.NET em execução, ou mesmo todos os aplicativos da Web ASP.NET em uma máquina, sem a necessidade de recompilação ou re-implantação.

Você não precisa detectar se está presente. Basta escrever seu código de log como se estivesse presente e, se não for, nada será registrado.

De interesse?: Como fazer com que Elmah trabalhe com o atributo ASP.NET MVC [Handleerror]? (A resposta aceita é do autor de Elmah)

Outras dicas

Você pode enumerar todos os módulos carregados (via HttpApplication.modules) e se existir módulo Elmah, Elmah está ativado:


foreach (var m in Application.Modules) {
  if (m is Elmah.ErrorlogModule) {
   // ...
  }
}

Não tenho certeza. Não é mais árduo.

Além da resposta de Tadas, criei o código a seguir que funciona para mim (observe que eu traduzi isso do VB sem verificar se ele compilar, então YMMV):

bool foundElmah = false;

foreach (var m in HttpContext.Current.ApplicationInstance.Modules) {
    var module = HttpContext.Current.ApplicationInstance.Modules.Item(m);
    if (module is Elmah.ErrorLogModule || module is Elmah.ErrorMailModule || module is Elmah.ErrorFilterModule || module is Elmah.ErrorTweetModule) {
        foundElmah = true;
        break;
    }
}

if (foundElmah) {
    // do something here, like populate the application cache so you don't have to run this code every time
    return true;
} else {
    // store in application cache, etc.
    return false;
}

Isso também contorna os problemas que tive com a obtenção de uma resposta 401 ao solicitar Elmah.axd (eu estava usando a autenticação do Windows) e é muito mais rápido e não assume um local específico para elmah.axd.

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