получение исключения при обновлении конфигурации в памяти при изменении во внешний файл конфигурации - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть служба Windows, которая считывает параметры конфигурации из внешнего файла, который находится по другому пути, чем путь к исполняемому файлу для службы Windows.служба Windows использует FileSystemWatcher для отслеживания изменений во внешнем файле конфигурации, и когда он изменяется, он должен обновить настройки в памяти, прочитав обновленные настройки из файла конфигурации.но именно здесь я получаю исключение «ConfigurationErrorsException» и появляется сообщение «Произошла ошибка при создании обработчика раздела конфигурации для appSettings: процесс не может получить доступ к файлу« M: \ somefolder \ WindowsService1.Config », поскольку он используетсядругой процесс. "и внутреннее исключение на самом деле "IOException" с тем же сообщением.вот кодЯ не уверен, что не так с кодом.Пожалуйста помоги.

protected void watcher_Changed(object sender, FileSystemEventArgs e)
{
    ConfigurationManager.RefreshSection(ConfigSectionName);
    WriteToEventLog(ConfigKeyCheck);

    if (FileChanged != null)
        FileChanged(this, EventArgs.Empty);
}

private void WriteToEventLog(string key)
{
    if (EventLog.SourceExists(ServiceEventSource))
    {
        EventLog.WriteEntry(ServiceEventSource,
                            string.Format("key:{0}, value:{1}", key, ConfigurationManager.AppSettings[key]));                
    }
}

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Следует ожидать возникновения исключений ввода-вывода при попытке перечитать раздел конфигурации при каждом обнаруженном изменении. Например, файл может быть заблокирован (как в вашем случае), или запись может быть завершена только частично. Вы должны просто поместить код в блок try / catch, перехватить IOException s (и, возможно, больше) и повторить обновление позже, возможно, по истечении таймера.

0 голосов
/ 22 декабря 2010

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

private void WriteToEventLog(string key)
{
    try
    {
        if (EventLog.SourceExists(ServiceEventSource))
        {
            EventLog.WriteEntry(ServiceEventSource,
                                string.Format("key:{0}, value:{1}", key, ConfigurationManager.AppSettings[key]));
            _configReadCount = 0;
        }
    }
    catch (Exception)
    {
        System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1)); //sleep for a minute and try again
        _configReadCount++;
        if (_configReadCount <= 3) //try 3 times 
            WriteToEventLog(ConfigKeyCheck);
    }

}
...