Determinar se o Elmah está ativado ou não?
Pergunta
Como posso determinar programaticamente se Elmah está ativado?
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.