Pergunta

Eu tenho esse código simples que registros acrescenta um log para um arquivo de texto:

    public static void RecordToFile(string filename, Log log)
    {
            TextWriter textWriter = new StreamWriter(Constants.APP_PATH + 
                "\\" + filename, true);
            textWriter.WriteLine(log.ToString());
            textWriter.Close();
    }

Isso funciona perfeitamente em uma aplicação Windows Forms. No entanto, usando o instsrv e srvany truque, eu fiz este um serviço do Windows. O serviço funciona muito bem, acessa o banco de dados, consultas executa e tudo ... Exceto para este StreamWriter. O registo só não é atualizado como deveria. Alguma idéia por que?

Foi útil?

Solução

O mais provável é que o serviço é executado sob as credenciais do usuário que não tem direitos de acesso para o diretório.

Portanto, verifique a caixa de diálogo Propriedades para o serviço, e verificar a guia Log On para ver o que ele fizer logon como.

Outras dicas

As razões possíveis:

  1. Constants.APP_PATH está apontando para uma unidade mapeada - serviços não são executados no mesmo ambiente como um usuário conectado, de modo que o caminho pode não ser válida
  2. Permissões - dependendo do que usuário o serviço está sendo executado, ele pode não ter acesso ao mesmo conjunto de diretórios que o aplicativo WinForms fez

Sem mais informações, não há muito que qualquer um pode ajudar. De que maneira, exatamente, não é função? Você recebe uma exceção? Será que apenas falhar silenciosamente?

Apenas um par de dicas ...

1) Não use concatenação para criar caminhos de arquivo. Use System.IO.Path.Combine vez. Como esta:

TextWriter textWriter = new StreamWriter(
    System.IO.Path.Combine(Constants.APP_PATH, filename), true);

2) Coloque o seu gravador em um bloco using(). Como assim:

using(TextWriter textWriter = new StreamWriter(
        System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
    textWriter.WriteLine(log.ToString());
}

3) Verifique se a conta do serviço está usando tem acesso para criar / Substituir arquivos nesse diretório. Muitas vezes, contas de serviços como LOCAL_SYSTEM ou NETWORK_SERVICE não vão ter as mesmas permissões que as contas de usuário faria. Isto poderia explicar por que ela funciona como um usuário, mas não como um serviço. Também poderia ser que as suas constantes pontos APP_PATH para algo específico do usuário, como um mapeamento de unidade para um compartilhamento de rede. mapeamentos de unidade não abrangem os usuários, de modo que este também poderia ser um problema.

Sem mais nenhuma informação eu acho que a sua conta do serviço está sendo executado sob não tem direitos para abrir o ficheiro para escrita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top