Обычно я получаю такую ошибку: (Служба «имя службы» на локальном компьютере была запущена, а затем остановлена. Некоторые службы останавливаются автоматически, если они не используются другими службами или программами), когда что-то не так с моим кодом, например, несуществующий пути к диску и т. д. Служба Windows не запускается.
У меня есть служба Windows, которая выполняет резервное копирование папки / файлов в место, если оно достигло предельного размера. Все подробности предоставляются XML-конфигурацией, которую служба Windows читает при запуске. У меня есть отдельные формы Windows, в которых есть кнопка, которая делает именно то, что делает при запуске моей службы Windows. Я использую свои формы Windows для отладки кода перед тем, как поместить его в свою службу Windows.
Когда я запускаю свои окна. Он делает то, что должен делать. Когда я поместил свой код в метод OnStart () службы Windows, появилась ошибка.
Вот мой код:
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 работал нормально. В чем проблема?
ОБНОВЛЕНИЕ: после многих испытаний я заметил, что при использовании только каталога папок (без файла) служба Windows не работает. Когда я заменил переменную fileWatch определенным файлом (включая его каталог), служба Windows запустилась. Когда я вернул его в папку, ничего не вышло. Я думаю, что расположение папок не работает в диспетчере файлов.
Когда я попытался создать новую службу Windows, которая следит за местоположением папки, она сработала .. Однако, когда я попробовал то же самое местоположение в исходной службе Windows, это не сработало! Я был наплевать! Кажется, что мне нужно создавать новую службу Windows и строить установщик каждый раз, когда я помещаю новый код / функцию. Таким образом я могу отслеживать, где я получаю ошибку.
источник
Не уверен, что это будет полезно, но для отладки службы вы всегда можете использовать в методе OnStart следующее:
чем вы могли бы присоединить свою визуальную студию к процессу и иметь лучшие возможности отладки.
надеюсь, это было полезно, удачи
источник
Я нашел очень удобным преобразовать существующую службу Windows в консоль , просто изменив вашу программу следующим образом. С этим изменением вы можете запускать программу путем отладки в Visual Studio или запускать исполняемый файл в обычном режиме. Но он также будет работать как служба Windows. Я также написал об этом в блоге
program.cs
ВАША ПРОГРАММА.cs
источник
Убедитесь, что вы зарегистрировали все конечные точки HTTP в локальном списке управления доступом (ACL).
http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html
источник
EventLog.Log должен быть установлен как «Приложение».
источник
Между тем, другая причина: случайно удаленный файл .config вызвал такое же сообщение об ошибке:
источник
Используйте таймер и отметьте событие, чтобы скопировать файлы.
При запуске службы запустите время и укажите интервал времени.
Таким образом, служба продолжает работать и копирует файлы ontick.
Надеюсь, это поможет.
источник
Вы можете захотеть провести модульное тестирование инициализации, но поскольку он находится в
OnStart
методе, это практически невозможно. Я бы посоветовал вынести код инициализации в отдельный класс, чтобы его можно было протестировать или хотя бы повторно использовать в тестере форм.Во-вторых, добавить ведение журнала (с помощью Log4Net или аналогичного) и добавить подробное ведение журнала, чтобы вы могли видеть подробности об ошибках времени выполнения. Примерами ошибок времени выполнения могут быть
AccessViolation
и т. Д., Особенно если ваша служба работает без достаточных прав для доступа к файлам конфигурации.источник
Учетная запись, на которой запущена служба, могла не сопоставить диск D: (они зависят от пользователя). Попробуйте поделиться каталогом и используйте полный UNC-путь в своем
backupConfig
.Ваш
watcher
of typeFileSystemWatcher
является локальной переменной и выходит за рамки, когдаOnStart
метод выполнен. Вероятно, она вам понадобится как переменная экземпляра или класса.источник
Я столкнулся с той же проблемой. Моя служба загружает / получает XMLS и записывает ошибки в журнал событий.
Когда я зашел в журнал событий, я попытался его отфильтровать. Это подсказывает мне, что журнал событий был поврежден.
Я очистил журнал событий и все в порядке.
источник
В нашем случае в журналы событий Windows ничего не было добавлено, кроме журналов того, что проблемная служба была запущена, а затем остановлена.
Оказалось, что файл CONFIG службы был недействителен. Исправление неверного файла CONFIG устранило проблему.
источник