Normalmente, recebo este erro: (O serviço "nome do serviço" no Computador Local foi iniciado e depois interrompido. Alguns serviços param automaticamente se não estiverem em uso por outro serviço ou programa) quando há algo errado com meu código, como inexistente caminhos da unidade, etc. O serviço do Windows não será iniciado.
Eu tenho um serviço do Windows que faz backup de pastas / arquivos em um local se atingiu o limite de tamanho. Os detalhes são fornecidos por uma configuração XML que o serviço do Windows lê na inicialização. Eu tenho um windows forms separado que tem um botão que faz exatamente o que o onstart do meu serviço do Windows está fazendo. Eu uso meus formulários do Windows para depurar o código antes de colocá-lo no serviço do Windows.
Quando eu inicio o meu windows forms. Ele faz o que deveria fazer. Quando coloquei meu código no método OnStart () do serviço do Windows, o erro apareceu.
Este é o meu código:
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();
}
}
Não sei o que impede o serviço do Windows de iniciar, o simulador do Windows Form funcionou bem. Oque parece ser o problema?
ATUALIZAÇÃO: Depois de muitas tentativas, notei que usando apenas um diretório de pasta (sem arquivo), o serviço do Windows não funciona. Quando substituí a variável fileWatch por um arquivo específico (incluindo seu diretório), o serviço do Windows foi iniciado. Quando mudei de volta para um local de pasta, não funcionou. O que eu acho é que os locais das pastas não funcionam em um arquivador.
Quando tentei criar um novo serviço do Windows que vigia o local de uma pasta, funcionou. No entanto, quando tentei o mesmo local no meu serviço do Windows original, não funcionou! Eu estava pensando! Parece que tenho que criar um novo serviço do Windows e construir o instalador toda vez que coloco um novo código / função. Desta forma, posso acompanhar onde recebo um erro.
fonte
Não tenho certeza se isso será útil, mas para depurar um serviço você sempre pode usar o seguinte no método OnStart:
do que você poderia anexar seu estúdio visual ao processo e ter melhores habilidades de depuração.
espero que tenha sido útil, boa sorte
fonte
Achei muito útil converter seu serviço do Windows existente em um console simplesmente alterando seu programa com o seguinte. Com essa mudança, você pode executar o programa depurando no Visual Studio ou executando o executável normalmente. Mas também funcionará como um serviço do Windows. Eu também fiz uma postagem no blog sobre isso
program.cs
YOUR_PROGRAM.cs
fonte
Verifique se você registrou todos os endpoints HTTP na lista de controle de acesso (ACL) do mahcine local
http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html
fonte
EventLog.Log deve ser definido como "Application"
fonte
Enquanto isso, outro motivo: excluído acidentalmente o arquivo .config causou a mesma mensagem de erro aparecer:
fonte
Use o cronômetro e o evento de marcação para copiar seus arquivos.
Ao iniciar o serviço, inicie o horário e especifique o intervalo no horário.
Assim, o serviço continua rodando e copia os arquivos ontick.
Espero que ajude.
fonte
Você pode querer fazer o teste de unidade da inicialização - mas, como está no
OnStart
método, isso é quase impossível. Eu sugeriria mover o código de inicialização para uma classe separada para que ele possa ser testado ou pelo menos reutilizado em um testador de formulário.Em segundo lugar, adicionar algum registro (usando Log4Net ou similar) e adicionar algum registro detalhado para que você possa ver detalhes sobre erros de tempo de execução. Exemplos de erros de tempo de execução seriam
AccessViolation
etc., especialmente se seu serviço estiver sendo executado sem privilégios suficientes para acessar os arquivos de configuração.fonte
A conta que está executando o serviço pode não ter mapeado a unidade D: (eles são específicos do usuário). Tente compartilhar o diretório e use o caminho UNC completo no seu
backupConfig
.Seu
watcher
do tipoFileSystemWatcher
é uma variável local e está fora do escopo quando oOnStart
método é concluído. Você provavelmente precisará dele como uma instância ou variável de classe.fonte
Eu me deparei com o mesmo problema. Meu serviço está enviando / recebendo XMLS e gravando os erros no log de eventos.
Quando fui para o Registro de eventos, tentei filtrá-lo. Ele me avisou que o Log de eventos estava corrompido.
Limpei o registro de eventos e tudo OK.
fonte
Em nosso caso, nada foi adicionado aos Logs de Eventos do Windows, exceto os logs de que o serviço problemático foi iniciado e interrompido.
Acontece que o arquivo CONFIG do serviço era inválido. A correção do arquivo CONFIG inválido corrigiu o problema.
fonte