FileWatcher的Windows服务无法按预期工作

时间:2014-05-27 07:54:28

标签: c# .net service windows-services filesystems

Windows服务(即 Email_Tool ),之前工作正常,最近一直没有正常工作。

服务概述

  1. Email_Tool是一个Windows服务,它使用FileWatchers轮询目录。
  2. 它一直在观看目录,在收到某些文件后,它会向用户发送电子邮件。
  3. 它监视的路径是一个共享路径,具有不同用户的不同权限。我的服务使用具有读取权限的服务帐户。
  4. 收到文件和发送电子邮件会记录到文件中(即 ServiceLog.txt )。
  5. 解释工作流程的示例: 在上述位置创建名称为21052014的文件夹(创建名称为当前日期的文件夹)。在该文件夹中,几个文件到达(Date.txt,InputsLog_20140520.txt,PTool_Start_20-05-2014.txt,PTool_End_20-05-2014.txt)。因此,该服务发送邮件,记录日志文件中的每一步以进行支持操作。
  6. 遇到问题

    自几天以来,Email_Tool一直未按预期工作。这些步骤未记录在日志文件中,并且未发送电子邮件。

    采取的步骤

    我们采取了许多措施来确定问题。以下是其中几个:

    1. 为了证明代码正常工作,我们使用较低环境的本地文件路径(F驱动器)作为文件路径。该服务工作正常,邮件已发送。
    2. 我们尝试在较低环境中使用共享路径作为路径。该服务运行良好,邮件已发送。
    3. 我们尝试使用其他较低环境中的生产中使用的共享路径,我们在其中创建了新文件夹并为其提供了适当的权限。这没有用。
    4. 很明显,之前工作的服务不适用于生产中使用的共享路径。

      值得注意的信息

      1. 当我们停止然后 START 该服务时,尝试通过创建文件夹和移入文件来查看工作流程(如上面的服务概述中所述),服务工作几个步骤,然后陷入混乱。我可以确认这一点,因为我可以在日志文件中看到有时创建文件夹的步骤(并非总是如此)。我无法理解为什么这可以用于几个步骤然后停止工作,就像在其他文件服务器上一样,它可以完美地工作。
      2. 就在服务陷入混乱的前一天,共享路径被转移到另一个不同的硬件。我们几乎可以肯定这个问题是由此造成的。但是,维护此共享路径的团队已确认在硬件迁移后权限保持不变。
      3. 我尝试通过将代码移动到表单应用程序来调试代码,并提出以下数字/代码:
      4. BaseException

        基本异常区域提供了以下代码:

        ErrorCode:-2147467259 本机错误代码:58

        以上原生错误代码58指向以下(谷歌搜索)

        ERROR_BAD_NET_RESP 58(0x3A) 指定的服务器无法执行请求的操作。

        的InnerException

        内部异常显示以下代码:

        _COMPlusExceptionCode -532459699 int

        服务开始事件有此代码段

           m_Watcher = new System.IO.FileSystemWatcher();
                    m_Watcher.Filter = "*.*";
                    m_Watcher.Path = @filWatcherPath;
                    m_Watcher.IncludeSubdirectories = true;
        
        
        
                    m_Watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                    m_Watcher.Created += new FileSystemEventHandler(OnChanged);
        
                    //  m_Watcher.Error += new ErrorEventHandler(OnError);
        
                    m_Watcher.EnableRaisingEvents = true;
        

        作为一种解决方法,我们使用了另一个文件服务器,该服务器正常运行。但我们必须找到一个解决办法。如果我必须提供任何其他信息,请告诉我。我之前发过这个问题,但我认为这篇文章提供了更多细节。

2 个答案:

答案 0 :(得分:0)

documentation中有一句话写着:

  

远程计算机必须安装一个必需的平台才能使组件正常运行。

如果您的硬件发生了变化,请确保您在FileSystemWatcher的另一侧仍然拥有所需的平台之一。

答案 1 :(得分:0)

找到了这个问题的根本原因。被监视的目录正在脱离网络驱动器,可能是由于网络故障。即使在目录被附加之后,文件观察者也无法在重新启动之前查看该目录。

解决方案是在发生此类事件时引发异常,然后自动重启监视器(或任何其他方法以优雅地处理该情况)

有一个标志:EnableRaisingEvents。必须设置为true才能捕获此类错误。 阅读有关EnableRaisingEvents here

的信息