通常,我收到此错误: (本地计算机上的“服务名称”服务启动然后停止。当我的代码出现问题时,如某些服务未被其他服务或程序使用,有些服务会自动停止,例如不存在的驱动器路径等。窗口服务无法启动。
如果达到大小限制,我有一个将文件夹/文件备份到某个位置的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服务并构建安装程序。这样我就可以跟踪出错的地方。
答案 0 :(得分:182)
如果服务启动和停止,则意味着您的代码抛出了未处理的异常。这很难调试,但有一些选择。
答案 1 :(得分:36)
不确定这会有所帮助,但是对于调试服务,您始终可以在OnStart方法中使用以下内容:
protected override void OnStart(string[] args)
{
System.Diagnostics.Debugger.Launch();
...
}
比你可以将视觉工作室附加到过程中并具有更好的调试能力。
希望这有帮助, 祝你好运
答案 2 :(得分:9)
通过简单地使用以下内容更改程序,我发现将现有的 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
}
}
答案 3 :(得分:3)
请检查您是否在本地mahcine的访问控制列表(ACL)中注册了所有HTTP端点
http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html
答案 4 :(得分:1)
EventLog.Log应设置为“Application”
答案 5 :(得分:1)
同时,另一个原因:意外删除了 .config 文件,导致出现了相同的错误消息:
“本地计算机上的服务已启动,然后停止。某些服务会自动停止...”
答案 6 :(得分:0)
使用Timer和tick事件复制文件。
启动服务时,启动时间并指定时间间隔。
所以服务一直在运行并复制文件。
希望有所帮助。
答案 7 :(得分:0)
您可能希望对初始化进行单元测试 - 但由于它在OnStart
方法中,这几乎是不可能的。我建议将初始化代码移到一个单独的类中,以便它可以在表单测试器中进行测试或至少重复使用。
其次,添加一些日志记录(使用Log4Net或类似)并添加一些详细日志记录,以便您可以查看有关运行时错误的详细信息。运行时错误的示例如AccessViolation
等,尤其是如果您的服务在没有足够权限访问配置文件的情况下运行。
答案 8 :(得分:0)
运行服务的帐户可能没有映射D:-drive(它们是用户特定的)。尝试共享目录,并在backupConfig
中使用完整的UNC路径。
watcher
类型FileSystemWatcher
是一个局部变量,在OnStart
方法完成后超出范围。您可能需要它作为实例或类变量。
答案 9 :(得分:0)
我遇到了同样的问题。我的服务是上传/接收XMLS并将错误写入事件日志。
当我进入事件日志时,我试图过滤它。它提示我事件日志已损坏。
我清除了事件日志,一切正常。
答案 10 :(得分:0)
在我们的情况下,Windows事件日志中未添加任何内容,但已记录有问题的服务已启动然后停止的日志。
事实证明该服务的CONFIG文件无效。更正无效的CONFIG文件可解决此问题。