2010-01-31 3 views
4

Comment puis-je déterminer par programme si oui ou non ELMAH est activé?Déterminer si ELMAH est activé ou non?

+0

pourriez-vous expliquer votre question? tel qu'il est, cela n'a aucun sens (pour moi). –

+0

Certainement. J'expédie ELMAH avec un produit, mais c'est la décision du client de l'activer ou non (dans le web.config). J'ai besoin de savoir, lorsqu'une page est en cours de chargement, si elle est activée ou non. Je suis heureux de répondre à vos questions. – lance

+0

ne pouvait pas simplement lire la section web.config pertinente? –

Répondre

1

Parce que:

ELMAH peut être dynamiquement ajouté à un en cours d'exécution application Web ASP.NET ou même toutes les applications Web ASP.NET sur une machine , sans aucun besoin de recompilation ou redéploiement.

vous ne devriez pas avoir besoin de détecter s'il est présent. Il suffit d'écrire votre code de journalisation comme s'il était présent, et si ce n'est pas le cas, rien ne sera enregistré.

intérêt ?: How to get ELMAH to work with ASP.NET MVC [HandleError] attribute? (réponse acceptée est par auteur de ELMAH)

+0

Je dois montrer un lien vers elmah.axd. Si elle est désactivée, je ne veux pas montrer le lien? – lance

+1

Pouvez-vous faire une requête web à elmah.axd et vérifier le code d'état? Peut-être le faire une fois et stocker les résultats dans la variable d'application pour des utilisations futures. – Greg

+0

@Greg: J'espérais éviter ces frais généraux. Votre solution est ce que j'ai codé jusqu'à présent, car c'est le meilleur que je puisse penser. Je vais essayer de parcourir la liste des modules chargés, selon la réponse de Tadas ci-dessus. – lance

2

Vous pouvez énumérer tous les modules chargés (via HttpApplication.Modules) et si existe le module Elmah, puis Elmah est activée:

 

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

Non sûr. N'a pas arboré ça.

+0

J'ai essayé, mais Application.Modules n'était pas disponible (ça fait longtemps que je n'ai pas essayé - je me souviens peut-être mal des détails, mais je n'ai pas réussi à le faire). Avez-vous du code réel que vous avez utilisé pour faire cela? – lance

0

Suite à la réponse de Tadas, je suis venu avec le code suivant qui fonctionne pour moi (note que je traduis cela de VB sans vérifier si elle compile, si 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; 
} 

Cela devient aussi autour des problèmes que j'ai eu avec obtenir une réponse 401 en demandant elmah.axd (j'utilisais l'authentification Windows), et est beaucoup plus rapide, et ne suppose pas un emplacement spécifique pour elmah.axd.

Questions connexes