Windows服务在安装时不起作用,在调试模式下工作正常;移动/删除文件时崩溃

本文关键字:移动 删除 文件 崩溃 不起作用 安装 服务 调试 Windows 模式 工作 | 更新日期: 2023-09-27 18:34:29

我创建了一个监视目录的Windows服务。当文件转储到其中时,它会获取数据并将其放入数据库中。然后,此文件将移动到另一个目录并删除。它在调试模式下工作正常。但是当我在计算机上安装它时,它会在将数据扔入数据库后停止,并且有问题的文件既没有移动也没有删除。我怀疑涉及权限问题。我尝试创建一个事件日志:

public Service1()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";         
    }

所以我有三个问题。(1( 什么可能导致我的服务按照调试中所述工作,但在计算机上安装时失败。(2( 我已启动如上所示的事件日志。但是我是否需要添加其他代码来记录我的服务停止的事件。我认为这将在"关闭时覆盖"方法中完成。(3( 最后,当我的服务停止时,我想查看事件日志。但是我不知道该怎么做,是在管理工具中吗?作为文件存储在某个目录中?

这是对这篇文章的编辑,以代替下面给出的感激建议。

      try
        {
            File.Move(e.FullPath, finalString);
            File.Delete(e.FullPath);
        }
        catch(Exception q)
        {
            EventLog.WriteEntry("MySource", q.ToString(), EventLogEntryType.Error);
            using (StreamWriter w = new StreamWriter(ConfigurationManager.AppSettings["fmd"], true))
            {
                w.Write(DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss"));
                w.Write(q.ToString());
            }
        }

根据建议,我在文件移动和删除周围放置了一个尝试捕获,并且我添加了一个 OnShutdown 方法:

 protected override void OnShutdown()
    {
        using (StreamWriter w = new StreamWriter(ConfigurationManager.AppSettings["ond"], true))
        {
            w.Write("stop OnShutdown");
        }
        //EventLog.WriteEntry("MySource", message, EventLogEntryType.Error);
    }

我不知道如何将任何系统错误消息传递给关闭方法,因此任何建议都表示赞赏。当我将修改后的代码安装为服务时,它在移动或删除文件之前再次停止。我通过流访问的两个日志都没有记录任何内容。另外,事件查看器也什么也没显示?

Windows服务在安装时不起作用,在调试模式下工作正常;移动/删除文件时崩溃

你可以

这样写,

if (!EventLog.SourceExists("MySource"))
   EventLog.CreateEventSource("MySource", "Application");    
EventLog.WriteEntry("MySource", message, EventLogEntryType.Error);

要查看事件日志消息,请转到管理员工具 ->事件查看器并查找已创建的源。 或者只需在运行窗口中键入 eventvwr。

安装服务后,它在系统用户帐户下工作,服务可能无法访问某些资源。请放置日志,看看问题到底在哪里。

如果服务安装在开发计算机中,请使用 Visual Studio 中"调试"菜单下的"附加到进程"选项进行查找。

什么可能导致我的服务按照调试中所述工作,但在计算机上安装时失败?

权限。如果未提供其他标识,则服务可能在LocalSystemNetwork Service下运行。

我已启动如上所示的事件日志。但是我是否需要添加其他代码来记录我的服务停止的事件。我认为这将以"关闭时覆盖"方法完成?

是的,你的假设是正确的。

最后,当我的服务停止时,我想查看事件日志。但是我不知道该怎么做,是在管理工具中吗?

只需点击 Windows 键 + R 获取Run对话框并键入 eventvwr .

好吧,我找到了所有骚动的原因。我最终在事件查看器中找到了一些日志。它们列在自定义日志的管理事件中。有三个错误日志:.Net 运行时;应用程序错误和服务控制管理器。在".Net Runtime"中,堆栈显示了system.windows.forms的未处理异常。我愚蠢地在我的发布版本中包含一个弹出框。但即使我对此发表评论;我收到一个错误。所以我回去找到了其他消息框,主要是在 try catch 语句中。删除了这些并解决了问题。