FileSystemWatcher OnError无法从Windows服务运行

时间:2013-02-12 18:05:34

标签: .net windows-services filesystemwatcher

我在Windows服务中有一个FileSystemWatcher对象。我在一个控制台应用程序中使用该应用程序将其编写为我的组件的存根。

我的组件实例化FileSystemWatcher并设置为观察映射的驱动器。这对我来说非常适合测试存根控制台应用程序和可部署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)

但是,在Windows服务中运行时,此日志错误将无效。

有没有人知道为什么或如何修复?

1 个答案:

答案 0 :(得分:0)

首先,您的服务是否使用可以访问您要监控的目录的帐户运行。 99%的时间,运行“控制台”应用程序并运行“服务”在两个不同的用户上下文中运行。如果该用户上下文无权访问该目录(或者URL仅表示另一个用户上下文中的内容),我认为不会调用OnError。

其次,FileSystemWatcher相当不可靠。它大部分时间都有效,但有时却没有。它使用底层的本机函数``,用

记录
  

当您第一次调用ReadDirectoryChangesW时,系统会分配一个   缓冲区来存储更改信息。此缓冲区与   目录句柄,直到它关闭,其大小不会改变   在其一生中。调用之间发生的目录更改   此函数被添加到缓冲区,然后返回下一个   呼叫。如果缓冲区溢出,则缓冲区的全部内容都是   丢弃后,lpBytesReturned参数包含零,并且   ReadDirectoryChangesW函数失败并显示错误代码   ERROR_NOTIFY_ENUM_DIR