Как обработать событие обновления содержимого web.config? Как определить, что web.config изменился? - PullRequest
1 голос
/ 17 ноября 2010

Как обработать событие обновления содержимого web.config? Я имею в виду не для целей администратора (wmi и т. Д.), А для программирования - мне нужно пересчитать некоторые данные внутри веб-службы в случае изменения параметра конфигурации.

Нет подходящих событий в WebConfigurationManager, ConfigurationManager, Configuration, ConfigurationSection, SectionInformation ... Так куда их копать?

P.S. .net 3.5

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Вы можете использовать System.IO. FileSystemWatcher для отслеживания изменений в любом файле, включая Web.config.Это вызовет событие при изменении файла.

1 голос
/ 18 ноября 2010

Использование System.IO.FileSystemWatcher приносит две проблемы архитектуры (и одна головная боль - безопасность). Во-первых, это невозможность заблокировать «всю конфигурацию» (статическую и повторно вычисляемую) во время изменений, а во-вторых, вопрос, где разместить поток мониторинга.

Было бы хорошо иметь рамочное событие, к сожалению, такого события нет. Но я обнаружил, что есть удобное решение - иметь пользовательский раздел конфигурации с переопределенным методом PostDeserialize. Существует некоторый риск, так как я не понимаю весь процесс, есть много мистики: экземпляр каждой секции воссоздается при каждом редактировании конфигурации ДВАЖДЫ, конструктор вызывается дважды, метод Init вызывается дважды, когда PostDeserialize - вызывается только один раз - так что хорошо для нас - но кто знает, что мы можем встретить в производстве ...

public class CustomSettings : ConfigurationSection
    {
           protected override void PostDeserialize()
            {
                base.PostDeserialize();
                findCertificate(this["Thumbprint"]); // searching for certificate in windows certificate repository and setup Certificate property
            }

            public CustomSettings()
            {
                InternalProperties = new ConfigurationPropertyCollection(/*... */)
            }
            //...
            public X509Certificate Certificate { get; private set; }

    }
...