c# – 本地计算机上的Windows服务已启动,然后停止错误

问题:

通常,我收到此错误:(本地计算机上的“服务名称”服务启动然后停止。如果我的代码出现问题,如某些服务未被其他服务或程序使用,则会自动停止驱动路径等.Windows服务无法启动。

如果达到大小限制,我有一个备份文件夹/文件的Windows服务到一个位置。 详细信息都是由Windows服务在启动时读取的XML配置提供的。 我有一个单独的窗体,有一个按钮,完全符合我的Windows服务的启动。 在将其放入Windows服务之前,我使用我的Windows窗体来调试代码。

当我启动我的Windows窗体。 它做了它想做的事情。 当我把我的代码放在Windows服务OnStart()方法时出现错误。

这是我的代码:

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

我不知道是什么让Windows服务无法启动,Windows窗体模拟器工作正常。 什么似乎是问题?

更新:经过多次试验,我注意到只使用文件夹目录(w / out文件),Windows服务不起作用。 当我用特定文件(包括其目录)替换fileWatch变量时,Windows服务启动了。 当我将其更改回文件夹位置时,它无法正常工作。 我认为文件夹位置在filewatcher中不起作用。

当我尝试创建一个监视文件夹位置的新Windows服务时,它工作..但是,当我在原始的Windows服务中尝试相同的位置时,它不起作用! 我很精神!#ed ed! 似乎每次我放置一个新的代码/函数时我都必须创建一个新的Windows服务并构建安装程序。这样我就可以跟踪我收到错误的位置。

Usually, I get this error: (The “service name” service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other service or programs) when there’s something wrong with my code, like non-existing drive paths, etc. The windows service will not start.I have a windows service that backs up folder/files, to a location if it reached the size limit.Details are all provide by an XML Configuration that the windows service reads on start.I have a separate windows forms that has a button that does exactly what my windows service’s onstart is doing.I use my windows forms for debugging the code before I put it in my windows service.When I start my windows forms.It does what it suppose to do.When I put my code in the windows service OnStart() method the error showed up.Here’s my code:I don’t know what keeps the windows service not starting, the windows form simulator worked fine.What seems to be the problem?UPDATE: After many trials I’ve noticed that using only a folder directory (w/out file), the windows service doesn’t work.When I replaced the fileWatch variable with a specific file (including its directory), the windows service started.When I changed it back to a folder location, it didn’t work.What I think is that folder locations doesn’t work in a filewatcher.When I tried creating a new windows service that watches a folder location, it worked.. However, when I tried the same location in my original windows service, it didn’t work!I was mindf$#*ed!It seems that I have to create a new windows service and build the installer everytime I place a new code/function.. This way I can keep track where I get an error.

解决方案:

方案1:

如果服务像这样开始和停止,则意味着您的代码抛出了未处理的异常。 这很难调试,但有一些选择。

  1. 请参阅Windows 事件查看器 通常,您可以通过转到计算机/服务器管理器,然后单击“ 事件查看器” – >“ Windows日志” – >“ 应用程序”来实现此目的 你可以在这里查看抛出异常的内容,这可能有所帮助,但是你没有获得堆栈跟踪。
  2. 将程序逻辑提取到库类项目中。 现在创建两个不同版本的程序:控制台应用程序(用于调试)和Windows服务。 (这是一些初步的努力,但从长远来看可以节省很多焦虑。)
  3. 添加更多try / catch块并登录到应用程序以更好地了解正在发生的事情。

方案2:

不确定这会有所帮助,但是对于调试服务,您总是可以在OnStart方法中使用以下内容:

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

比你可以将你的视觉工作室附加到过程并具有更好的调试能力。

希望这有帮助,祝你好运

方案3:

我发现通过简单地用以下方法更改程序,将现有的Windows服务转换为控制台非常方便。 通过此更改,您可以通过在visual studio中调试或正常运行可执行文件来运行该程序。 但它也可以作为Windows服务。 我还发了一篇关于它的博客文章

Program.cs中

class Program
{
    static void Main()
    {
        var program = new YOUR_PROGRAM();
        if (Environment.UserInteractive)
        {
            program.Start();
        }
        else
        {
            ServiceBase.Run(new ServiceBase[]
            {
                program
            });
        }
    }
}

YOUR_PROGRAM.cs

[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
    public YOUR_PROGRAM()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    protected override void OnStop()
    {
        //Stop Logic Here
    }

    public void Start()
    {
        //Start Logic here
    }
}

方案4:

请检查您是否在本地mahcine的访问控制列表(ACL)中注册了所有HTTP端点

http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html

方案5:

EventLog.Log应设置为“应用程序”

方案6:

同时, 另一个原因:意外删除.config文件导致出现相同的错误信息:

“本地计算机上的服务已启动然后停止。某些服务会自动停止…”

方案7:

使用Timer和tick事件复制文件。

启动服务时,启动时间并指定时间间隔。

因此服务继续运行并复制文件。

希望它有所帮助。

方案8:

您可能希望对初始化进行单元测试 – 但由于它在OnStart方法中,这几乎是不可能的。 我建议将初始化代码移到一个单独的类中,以便可以在表单测试器中测试或至少重复使用它。

其次,添加一些日志记录(使用Log4Net或类似)并添加一些详细日志记录,以便您可以查看有关运行时错误的详细信息。 运行时错误的示例可能是AccessViolation等,特别是如果您的服务运行时没有足够的权限来访问配置文件。

方案9:

运行服务的帐户可能没有映射D:-drive(它们是用户特定的)。 尝试共享目录,并在backupConfig使用完整的UNC路径。

您的FileSystemWatcher类型的watcher是局部变量,并且在OnStart方法完成时超出范围。 您可能需要它作为实例或类变量。

方案10:

我遇到了同样的问题。 我的服务是上传/接收XMLS并将错误写入事件日志。

当我去事件日志时,我试图过滤它。 它提示我事件日志已损坏。

我清除了事件日志,一切正常。

方案11:

在我们的示例中,Windows事件日志中没有添加任何内容,除了有问题的服务已启动然后停止的日志。

事实证明该服务的CONFIG文件无效。 更正无效的CONFIG文件修复了该问题。

参考连接:

https://stackoverflow.com/questions/12209075/12209075