首页 文章

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

提问于
浏览
90

通常,我收到此错误:(本地计算机上的“服务名称”服务启动然后停止 . 如果我的代码出现问题,如某些服务未被其他服务或程序使用,则会自动停止驱动路径等.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服务并构建安装程序 . 这样我就可以跟踪我收到错误的位置 .

10 回答

  • 178

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

    • 请参阅Windows事件查看器 . 通常,您可以通过转到计算机/服务器管理器,然后单击“事件查看器” - >“Windows日志” - >“应用程序”来实现此目的 . 你可以在这里查看抛出异常的内容,这可能有所帮助,但是你没有获得堆栈跟踪 .

    • 将程序逻辑解压缩到库类项目中 . 现在创建两个不同版本的程序:控制台应用程序(用于调试)和Windows服务 . (这是一些初步的努力,但从长远来看可以节省很多焦虑 . )

    • 添加更多try / catch块并登录到应用程序以更好地了解正在发生的事情 .

  • 0

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

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

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

    希望这有帮助,祝你好运

  • 34

    我发现通过简单地用以下方法更改程序,将现有的Windows服务转换为控制台非常方便 . 通过此更改,您可以通过在visual studio中调试或正常运行可执行文件来运行该程序 . 但它也可以作为Windows服务 . I also made a blog post about it

    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
        }
    }
    
  • 0

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

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

  • 1

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

  • 3

    同时, another reason : 意外删除了 .config 文件导致出现同样的错误信息:

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

  • 1

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

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

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

    希望它有所帮助 .

  • 0

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

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

  • 0

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

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

  • 9

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

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

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

相关问题