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

通常,我得到这个错误:(在本地计算机上的“服务名称”服务启动,然后停止,有些服务在没有被其他服务或程序使用时自动停止),当我的代码出现问题时驱动器path等.Windows服务不会启动。

我有一个Windows服务备份文件夹/文件,如果它达到了大小限制的位置。 详细信息全部由Windows服务读取的XMLconfiguration提供。 我有一个单独的Windows窗体,有一个button,正是我的Windows服务的onstart正在做的事情。 我使用我的Windows窗体来debugging代码之前,我把它放在我的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服务不启动,窗体模拟器工作正常。 什么似乎是问题?

更新:经过多次审判,我已经注意到,只使用文件夹目录(w / out文件),Windows服务不起作用。 当我用特定文件(包括其目录)replacefileWatchvariables时,Windows服务启动。 当我将其更改回到文件夹位置时,它不起作用。 我认为这是文件夹位置不工作在filewatcher。

当我尝试创build一个新的Windows服务,看着一个文件夹的位置,它的工作..但是,当我尝试在我原来的Windows服务相同的位置,它不工作! 我是mindf $#ed! 看来,我必须创build一个新的Windows服务,并build立安装程序,每次我放置一个新的代码/函数。这样我可以跟踪我得到一个错误。

如果服务启动和停止,这意味着你的代码抛出一个未处理的exception。 这是很难debugging,但有几个选项。

  1. 请参阅Windows 事件查看器 。 通常情况下,您可以进入计算机/服务器pipe理器,然后单击事件查看器 – > Windows日志 – > 应用程序 。 你可以看到什么抛出exception,这可能会有所帮助,但你没有得到堆栈跟踪。
  2. 将您的程序逻辑解压缩到一个库类项目中。 现在创build两个不同版本的程序:一个控制台应用程序(用于debugging)和Windows服务。 (这是一个初步的努力,但从长远来看可以节省很多的焦虑。)
  3. 添加更多的try / catch块并logging到应用程序,以更好地了解发生了什么事情。

不知道这会有所帮助,但是对于debugging服务,您可以在OnStart方法中始终使用以下内容:

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

比你可以附加你的视觉工作室的过程,并有更好的debugging能力。

希望这是有益的,祝你好运

我发现它非常方便转换您的现有Windows服务控制台只需更改您的程序与以下。 有了这个改变,你可以通过在Visual Studio中debugging或者正常运行可执行文件来运行程序。 但它也将作为一个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 } } 

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

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

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

使用计时器和滴答事件来复制您的文件。

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

所以这个服务一直在运行,然后复制这些文件。

希望它有帮助。

你可能想unit testing初始化​​ – 但是因为它在OnStart方法中几乎不可能。 我build议将初始化代码移出一个单独的类,以便它可以被testing或至less在表单testing器中重新使用。

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

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

您的types为FileSystemWatcher watcher是一个本地variables,并且在OnStart方法完成时超出了范围。 你可能需要它作为一个实例或类variables。

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

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

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