Question

J'ai ce code simple qui enregistre ajoute un journal à un fichier texte:

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

Cela fonctionne parfaitement dans une application Windows Forms. Cependant, en utilisant l’astuce instsrv et srvany , j’en ai fait un service Windows. Le service fonctionne correctement, accède à la base de données, effectue des requêtes et tout ... sauf pour ce StreamWriter. Le journal n'est tout simplement pas mis à jour comme il se doit. Des idées pourquoi?

Était-ce utile?

La solution

Il est fort probable que le service s'exécute sous des informations d'identification de l'utilisateur qui ne disposent pas de droits d'accès à ce répertoire.

Vérifiez donc la boîte de dialogue des propriétés du service, puis cliquez sur l'onglet Ouvrir une session pour voir comment il se connecte.

Autres conseils

Raisons possibles:

  1. Constants.APP_PATH pointe vers un lecteur mappé - les services ne s'exécutant pas dans le même environnement qu'un utilisateur connecté, le chemin peut ne pas être valide
  2. Autorisations - selon l'utilisateur sous lequel le service est exécuté, il peut ne pas avoir accès au même ensemble de répertoires que l'application WinForms a créé

Sans plus d'informations, personne ne peut aider. En quoi exactement ne fonctionne-t-il pas? Avez-vous une exception? Est-ce que cela échoue simplement en silence?

Juste quelques conseils ...

1) N'utilisez pas la concaténation de chaînes pour créer des chemins de fichiers. Utilisez plutôt System.IO.Path.Combine . Comme ceci:

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

2) Placez votre auteur dans un bloc utilisant () . Comme si:

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

3) Vérifiez que le compte utilisé par le service a le droit de créer / remplacer les fichiers de ce répertoire. Souvent, les comptes de service tels que LOCAL_SYSTEM ou NETWORK_SERVICE ne disposeront pas des mêmes autorisations que les comptes d'utilisateur. Cela pourrait expliquer pourquoi cela fonctionne en tant qu'utilisateur mais pas en tant que service. Il se peut également que votre constante APP_PATH pointe sur quelque chose de spécifique à l'utilisateur, comme un mappage de lecteur sur un partage réseau. Les mappages de lecteurs ne couvrent pas les utilisateurs. Cela pourrait donc également poser problème.

Sans plus d'informations, je suppose que le compte sous lequel votre service est exécuté n'a pas le droit d'ouvrir le fichier en écriture.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top