Domanda

Ho questo semplice codice che registra accoda un registro a un file di testo:

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

Funziona perfettamente in un'applicazione Windows Form. Tuttavia, utilizzando il instsrv e srvany , ho reso questo un servizio Windows. Il servizio funziona bene, accede al database, esegue query e tutto ... Tranne questo StreamWriter. Il registro non viene aggiornato come dovrebbe. Qualche idea sul perché?

È stato utile?

Soluzione

Molto probabilmente il servizio è in esecuzione con le credenziali dell'utente che non dispone dei diritti di accesso a quella directory.

Quindi controlla la finestra di dialogo delle proprietà per il servizio e controlla la scheda Accedi per vedere come si connette.

Altri suggerimenti

Motivi possibili:

  1. Constants.APP_PATH punta a un'unità mappata: i servizi non vengono eseguiti nello stesso ambiente di un utente connesso, quindi il percorso potrebbe non essere valido
  2. Autorizzazioni - a seconda dell'utente in cui è in esecuzione il servizio, potrebbe non avere accesso allo stesso set di directory che l'app WinForms aveva

Senza ulteriori informazioni non c'è molto che chiunque possa aiutare. In che modo, esattamente, non funziona? Ricevi un'eccezione? Fallisce in silenzio?

Solo un paio di consigli ...

1) Non utilizzare la concatenazione di stringhe per creare percorsi di file. Utilizzare invece System.IO.Path.Combine . In questo modo:

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

2) Racchiudi il tuo autore in un blocco using () . In questo modo:

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

3) Verifica che l'account utilizzato dal servizio abbia accesso per creare / sovrascrivere i file in quella directory. Spesso gli account di servizio come LOCAL_SYSTEM o NETWORK_SERVICE non hanno le stesse autorizzazioni degli account utente. Questo potrebbe spiegare perché funziona come utente ma non come servizio. Potrebbe anche essere che la costante APP_PATH punti a qualcosa di specifico dell'utente, come un mapping di unità a una condivisione di rete. I mapping delle unità non si estendono agli utenti, quindi potrebbe essere un problema.

Senza ulteriori informazioni, immagino che l'account con cui è in esecuzione il tuo servizio non abbia i diritti per aprire il file per iscritto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top