Frage

Ich habe diesen einfachen Code, der ein Protokoll in eine Textdatei zeichnet anfügt:

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

Das funktioniert perfekt in einem Windows Forms-Anwendung. Doch mit dem instsrv und srvany Trick, ich habe diesen einen Windows-Dienst. Der Service läuft gut, greift auf die Datenbank, führt Abfragen und alle ... Mit Ausnahme dieses Stream. Das Protokoll funktioniert einfach nicht aktualisiert, wie es sollte. Irgendwelche Ideen, warum?

War es hilfreich?

Lösung

Höchstwahrscheinlich wird der Dienst unter Anmeldeinformationen des Benutzers ausgeführt wird, die Zugriffsrechte nicht auf dieses Verzeichnis hat.

So die Eigenschaften überprüfen für den Service-Dialog, und prüfen Sie auf die Registerkarte Anmelden, um zu sehen, was es meldet sich als.

Andere Tipps

Mögliche Ursachen:

  1. Constants.APP_PATH zeigt auf einem zugeordneten Laufwerk - Dienste als angemeldete in keine User in der gleichen Umgebung laufen, so kann der Pfad nicht gültig
  2. Berechtigungen - je nachdem, welche Benutzer auf die Dienste laufen, kann es keinen Zugriff auf den gleichen Satz von Verzeichnissen, die die WinForms-Anwendung hat

Ohne weitere Informationen gibt es nicht viel, dass jemand helfen kann. Auf welche Weise genau, funktioniert es nicht? Haben Sie eine Ausnahme erhalten? Ist es nur leise scheitern?

Nur ein paar Tipps ...

1) Verwenden Sie die String-Verkettung nicht Dateipfade zu erstellen. Verwenden Sie System.IO.Path.Combine statt. Wie folgt aus:

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

2) Schliessen Sie Ihren Schreiber in einem using() Block. Wie so:

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

3) Stellen Sie sicher, dass das Konto den Dienst verwendet, wird Zugriff hat erstellen / überschreiben Dateien in diesem Verzeichnis. Oft Dienstkonten wie LOCAL_SYSTEM oder NETWORK_SERVICE werden nicht würde die gleichen Berechtigungen wie Benutzerkonten haben. Dies könnte erklären, warum es als Benutzer funktioniert, aber nicht als Dienstleistung an. Es könnte auch sein, dass Ihre APP_PATH konstant Punkte zu etwas benutzerspezifische, wie eine Laufwerkszuordnung zu einer Netzwerkfreigabe. Laufwerkszuordnungen Benutzer nicht überspannen, so könnte dies auch ein Thema sein.

Ohne weitere Informationen Ich würde vermuten, dass das Konto Ihres Dienst unter ausgeführt wird keine Rechte hat, um die Datei zum Schreiben zu öffnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top