2013-02-12 5 views
1

У меня есть объект FileSystemWatcher в службе Windows. Я написал его в консольном приложении, используя это приложение в качестве заглушки для моего компонента.FileSystemWatcher OnError не работает из службы Windows

Мой компонент создает экземпляр FileSystemWatcher и настраивает просмотр подключенного диска. Это отлично работает для меня как из тестового заглушки Console App, так и для развертываемой службы Windows.

Я также событие OnError зацепил с log4net регистрацией фатальной ошибки уровня:

public FileSystemWatcher CreateFileWatcher() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 

     try 
     { 
      log.Info("Configuring DPIFileWatcher"); 
      watcher.Filter = "*.xml"; 
      log.Info("DPIFileWatcher Filter set to: *.xml"); 
      string watcherPath = ConfigurationManager.AppSettings["InoundPath"].ToString(); 
      watcher.Path = watcherPath; 
      log.Info(String.Format("DPIFileWatcher Path set to: {0}", watcherPath)); 

      watcher.Created += new FileSystemEventHandler(DPIWatcher_FileCreated); 
      watcher.Changed += new FileSystemEventHandler(DPIWatcher_FileChanged); 
      watcher.Error += new ErrorEventHandler(DPIWatcher_Error); 
      watcher.EnableRaisingEvents = true; 

      log.Info("DPIFileWatcher Configuration Successful."); 
     } 
     catch(Exception e) 
     { 
      log.Fatal(String.Format("Failed to configure DPIFileWatcher: {0}", e.Message)); 
     } 

     return watcher; 
    } 

Вот мое событие ошибки:

private void DPIWatcher_Error(object source, ErrorEventArgs e) 
    { 
     log.Fatal(String.Format("FileWatacher error: {0}", e.GetException().Message)); 
    } 

Если я испытываю к потере ошибки сети, вынув сетевая карта, я получаю следующую ошибку журнала из моего консольного приложения:

FATAL [ 12] 2013-02-12 12:14:02,142 SMILLER-E6430 METHOD: DPIWatcher_Error  GenFileWatch.DPIFileWatcher- FileWatacher error: The specified network name is no longer available (C:\Development\GenFileWatch\GenFileWatch\DPIFileWatcher.cs: 447) 

Но thi s ошибка журнала не будет работать при запуске из службы Windows.

Кто-нибудь знает, почему и как исправить?

+0

Записывает ли что-нибудь? – BNL

+0

Вы создаете экземпляр FileSystemWatcher из 'OnStart'? Что вы делаете со ссылкой после того, как создали ее? Он может быть собран преждевременно, поэтому событие никогда не срабатывает. Впрочем, догадка. –

ответ

0

Прежде всего, ваша служба работает с учетной записью, которая имеет доступ к каталогу, который вы пытаетесь контролировать. 99% времени, запуск «консольного» приложения и запуск «службы» выполняется в двух разных пользовательских контекстах. Если этот пользовательский контекст не имеет доступа к этому каталогу (или URL-адрес означает только что-то в другом пользовательском контексте), я не думаю, что OnError будет вызван.

Второй, FileSystemWatcher довольно ненадежный. Он работает, большую часть времени, но иногда нет. Он использует основную нативную функцию ``, которая документирована с помощью

When you first call ReadDirectoryChangesW, the system allocates a buffer to store change information. This buffer is associated with the directory handle until it is closed and its size does not change during its lifetime. Directory changes that occur between calls to this function are added to the buffer and then returned with the next call. If the buffer overflows, the entire contents of the buffer are discarded, the lpBytesReturned parameter contains zero, and the ReadDirectoryChangesW function fails with the error code ERROR_NOTIFY_ENUM_DIR

+0

Спасибо за отзыв. На ваш первый комментарий, однако, мы, очевидно, имеем доступ к файловому ресурсу через службу Windows, потому что основная функциональность отлично работает в сервисе. Файловый сервер прослушивает новые файлы в папке на подключенном диске, и созданное событие запускается, и мы делаем то, что хотим сделать. Таким образом, служба Win имеет доступ к этому диску. И поэтому мы не можем понять, почему onerror не говорит нам, что «указанное сетевое имя больше не доступно» из службы win, как это происходит из Console App. – Sam

+0

Кроме того, на ваш второй комментарий мы только начали тестировать это, но я прочитал, что вы можете увеличить размер буфера, чтобы исправить это. Хотя многим плохо для производительности. Так что это пробная версия и ошибка, чтобы все было правильно. – Sam

Смежные вопросы