Как написать и настроить собственный провайдер для ASP.Net Healthmonitoring? - PullRequest
0 голосов
/ 04 января 2011

Я ищу пошаговое руководство по созданию и использованию настраиваемого поставщика для ASP.Net Healthmonitoring.

До сих пор я работал только с провайдером электронной почты, который генерирует электронные письма об ошибках.По сути, я хочу сделать то же самое, но с большей гибкостью:
Я хочу использовать функции HealthMonitoring (я не хочу использовать событие Application_OnError в global.asax) таким образом, чтобы у меня был доступ ксобытие, которое генерируется как «OnNewHealthMonitoringEntry» со всей информацией, предоставленной в электронном письме, для запуска пользовательского кода.

Редактировать:
На основе исходного кода, предоставленного здесь http://www.asp.net/general/videos/how-do-i-create-a-custom-provider-for-logging-health-monitoring-events Я смог создать свой собственный провайдер и реализовать его.Теперь я хочу добавить несколько новых атрибутов для настройки моего собственного провайдера.Вот как выглядит файл web.config:

<healthMonitoring>
    <bufferModes>
        <add name="Log Notification" maxBufferSize="1" maxFlushSize="1" urgentFlushThreshold="1" regularFlushInterval="Infinite" urgentFlushInterval="00:00:10"/>
    </bufferModes>
    <providers>
        <add name="FileEventProvider" buffer="true" bufferMode="Log Notification" type="healthmonitoringtest.FileHealthMonitorEventProvider"/>
    </providers>
    <profiles>
        <add name="Custom" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>
    </profiles>
    <rules>
        <add name="File Event Provider" eventName="All Errors" provider="FileEventProvider" profile="Custom"/>
    </rules>
</healthMonitoring>

Если я попытаюсь добавить атрибут к провайдеру, например,

<providers>
    <add name="FileEventProvider" buffer="true" bufferMode="Log Notification" foo="bar"  type="healthmonitoringtest.FileHealthMonitorEventProvider"/>
</providers>

Я получу сообщение об ошибке:

Исключение типа System.Configuration.ConfigurationErrorsException произошло в System.Web.dll, но не было обработано в коде пользователя. Дополнительная информация: Неожиданный атрибут foo в конфигурации FileEventProvider.

Можно ли сохранить конфигурацию, необходимую для настраиваемого поставщика, рядом с разделом healthMonitoring?Думаю, я мог бы включить настройки в узел appSettings, но я бы хотел как-то настроить его с помощью атрибутов (внутри узла healthMonitoring).Это возможно?

Edit2 : Вы можете взглянуть на эту статью: http://www.tomot.de/en-us/article/6/asp.net/how-to-create-a-custom-healthmonitoring-provider-that-sends-e-mails

1 Ответ

2 голосов
/ 04 января 2011

Следующая серия статей ознакомит вас с основами использования системы мониторинга работоспособности вплоть до создания пользовательских событий.

Затем будет показано следующее 26-минутное видео .проведем вас через создание собственного провайдера, который записывает события в текстовый файл журнала.

ОБНОВЛЕНИЕ На основе комментария

Просмотр вашего обновления и использование Reflector для просмотраисточник для BufferedWebEventProvider класса, на котором вы основываете свой пользовательский провайдер, я обнаружил, что метод Initialize в BufferedWebEventProvider в конце проверяет, есть ли какие-либо атрибуты, которые он не распознает.Это делается путем удаления значений из параметра config NameValueCollection, как только они назначены свойствам или полям BufferedWebEventProvider.Затем выполняется проверка, чтобы определить, является ли параметр config пустым, и если нет, то это означает, что добавлены дополнительные атрибуты, что вызывает исключение.

Что касается того, как решить эту проблему, одним из вариантов являетсяto:

  1. Переместить вызов в base.Initialize до конца метода
  2. Удалите дополнительные атрибуты, как только вы назначите их переменным, как это делает поставщик.

Будет работать что-то вроде следующего:

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        foo = config["foo"];
        if (String.IsNullOrEmpty(foo))
        {
            // You can set a default value for foo
        }

        //remove foo from the config just like BufferedWebEventProvider with the other
        //attributes. Note that it doesn't matter if someone didn't proivde a foo attribute
        //because the NameValueCollection remains unchanged if you call its Remove method
        //and the name doesn't exist.
        config.Remove("foo");

        base.Initialize(name, config);
    }

Надеюсь, это сработает для вас.

...