【问题标题】:Windows service with FileWatcher not working as expected带有 FileWatcher 的 Windows 服务未按预期工作
【发布时间】:2014-05-27 07:54:27
【问题描述】:

之前运行良好的 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)。因此,该服务会发送一封邮件,将每个步骤记录在日志文件中以进行支持操作。

面临的问题

Email_Tool 几天以来一直没有按预期工作。这些步骤没有被记录在日志文件中,电子邮件也没有被发送出去。

采取的步骤

我们已采取许多步骤来确定问题。以下是其中的几个:

  1. 为了证明代码可以运行,我们使用lower环境的本地文件路径(F盘)作为文件路径。服务运行良好,邮件已发送。
  2. 我们尝试使用较低环境中的共享路径作为路径。服务运行良好,邮件已发送。
  3. 我们尝试使用其他较低环境的生产环境中使用的共享路径,我们在其中创建了新文件夹并赋予了它们适当的权限。这没有成功。

很明显,之前运行的服务不适用于生产中使用的共享路径。

值得注意的信息

  1. 当我们STOP然后START服务,并尝试通过创建文件夹和移动文件来查看工作流程(如上面的服务概述中所述),服务工作了几个步骤,然后就失控了。我可以确认这一点,因为有时(并非总是)可以在日志文件中看到创建文件夹的步骤。我无法理解为什么这在几个步骤中有效,然后停止工作,因为它在其他文件服务器上运行良好。
  2. 就在服务失控的前一天,共享路径被移动到不同的硬件软件。我们几乎可以肯定问题是由这个引起的。但维护此共享路径的团队已确认在硬件迁移后权限保持不变。
  3. 我尝试通过将代码移动到表单应用程序中来调试代码,并得出以下数字/代码:

基本异常

基础异常区给出以下代码:

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

以上原生错误码58指向如下(google搜索)

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

内部异常

内部异常显示如下代码:

_COMPlusExceptionCode -532459699 int

代码

服务启动事件有这个代码sn-p

   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;

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

【问题讨论】:

  • 文件服务器上的 Windows 更新?
  • 整个文件服务器被移到了新的硬件上。

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


【解决方案1】:

已找到此问题的根本原因。监视目录与网络驱动器分离,可能是由于网络故障。即使在目录被附加后,文件观察者也无法观察这个目录,直到它重新启动。

解决方案是在发生这种情况时引发异常,然后自动重新启动观察程序(或任何其他优雅地处理这种情况的方法)

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

【讨论】:

    【解决方案2】:

    documentation里面有一句写着:

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

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

    【讨论】:

    • 所以,如果我理解正确,那么远程文件服务器上必须有以下之一:Windows 8.1、Windows Server 2012 R2、Windows 8、Windows Server 2012、Windows 7、Windows Vista SP2、Windows Server 2008(不支持服务器核心角色)、Windows Server 2008 R2(SP1 或更高版本支持服务器核心角色;不支持安腾)
    • 是的,好像是这样。不过我自己从未尝试过。
    • 好的。我需要与文件服务器团队确认。会询问他们新旧硬件是否具有上述任何平台。
    • @AnkitMittal 你能找出错误 58 的原因吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多