Определить, включен ли ELMAH?

Как программно определить, включен ли ELMAH?


person lance    schedule 31.01.2010    source источник
comment
не могли бы вы объяснить свой вопрос? в нынешнем виде это не имеет смысла (для меня).   -  person Mitch Wheat    schedule 31.01.2010
comment
Безусловно. Я отправляю ELMAH с продуктом, но решение о том, включать или отключать его (в файле web.config), остается за клиентом. Мне нужно знать, когда страница загружается, включена она или нет. Я рад ответить на любые вопросы.   -  person lance    schedule 31.01.2010
comment
не мог просто прочитать соответствующий раздел web.config?   -  person Mitch Wheat    schedule 31.01.2010
comment
Я думал об этом, но я надеялся, может быть, на что-то другое, особенно учитывая, что раздел web.config, который сообщает вам, включен ли он, меняется с IIS6 на IIS7. Например, может быть что-то, что дает мне какую-то программную видимость обработчика для данного пути...   -  person lance    schedule 31.01.2010


Ответы (3)


Потому что:

ELMAH можно динамически добавлять в работающее веб-приложение ASP.NET или даже во все веб-приложения ASP.NET на компьютере без необходимости повторной компиляции или повторного развертывания.

вам не нужно определять, присутствует ли он. Просто напишите свой код регистрации, как если бы он присутствовал, и если это не так, ничего не будет зарегистрировано.

Интересно?: Как заставить ELMAH работать с атрибутом ASP.NET MVC [HandleError]? (принятый ответ принадлежит автору ELMAH)

person Mitch Wheat    schedule 31.01.2010
comment
Мне нужно показать ссылку на elmah.axd. Если он отключен, я не хочу показывать ссылку? - person lance; 31.01.2010
comment
Можете ли вы сделать веб-запрос к elmah.axd и проверить код состояния? Возможно, сделайте это один раз и сохраните результаты в переменной приложения для использования в будущем. - person Greg; 01.02.2010
comment
@Greg: я надеялся избежать этих накладных расходов. Ваше решение - это то, что я закодировал до сих пор, так как это лучшее, что я мог придумать. Я собираюсь попробовать просмотреть список загруженных модулей в соответствии с ответом Тадаса выше. - person lance; 02.02.2010

Вы можете перечислить все загруженные модули (через HttpApplication.Modules), и если модуль Elmah существует, то Elmah включен:


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

Не уверена. Не врубал это.

person Tadas Šukys    schedule 02.02.2010
comment
Я пробовал это, но Application.Modules был недоступен (прошло некоторое время с тех пор, как я пытался - я мог неправильно помнить детали, но я не мог этого сделать). У вас есть реальный код, который вы использовали для этого? - person lance; 05.03.2010

В дополнение к ответу Тадаса я придумал следующий код, который работает для меня (обратите внимание, что я перевел его из VB, не проверяя, компилируется ли он, поэтому 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;
}

Это также позволяет обойти проблемы, которые у меня были с получением ответа 401 при запросе elmah.axd (я использовал проверку подлинности Windows), и намного быстрее, и не предполагает определенного местоположения для elmah.axd.

person GregL    schedule 13.07.2011