Pregunta

Tengo este código simple que registra agrega un registro a un archivo 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();
    }

Esto funciona perfectamente en una aplicación de Windows Forms. Sin embargo, utilizando el instsrv y srvany , hice de este un servicio de Windows. El servicio funciona bien, accede a la base de datos, realiza consultas y todo ... Excepto este StreamWriter. El registro simplemente no se actualiza como debería. ¿Alguna idea de por qué?

¿Fue útil?

Solución

Lo más probable es que el servicio se ejecute con credenciales de usuario que no tiene derechos de acceso a ese directorio.

Por lo tanto, consulte el cuadro de diálogo de propiedades para el servicio y consulte la pestaña Iniciar sesión para ver cómo se registra.

Otros consejos

Posibles razones:

  1. Constants.APP_PATH apunta a una unidad asignada: los servicios no se ejecutan en el mismo entorno que un usuario conectado, por lo que la ruta puede no ser válida
  2. Permisos: según el usuario que ejecute el servicio, es posible que no tenga acceso al mismo conjunto de directorios que tenía la aplicación WinForms

Sin más información, no hay mucho con lo que alguien pueda ayudar. ¿De qué manera, exactamente, no funciona? ¿Tienes una excepción? ¿Simplemente falla en silencio?

Solo un par de consejos ...

1) No use la concatenación de cadenas para crear rutas de archivos. Utilice System.IO.Path.Combine en su lugar. Así:

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

2) Adjunte su escritor en un bloque usando () . Me gusta así:

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

3) Verifique que la cuenta que utiliza el servicio tenga acceso para crear / sobrescribir archivos en ese directorio. A menudo, las cuentas de servicio como LOCAL_SYSTEM o NETWORK_SERVICE no tendrán los mismos permisos que las cuentas de usuario. Esto podría explicar por qué funciona como usuario pero no como servicio. También podría ser que su constante APP_PATH apunte a algo específico del usuario, como una asignación de unidad a un recurso compartido de red. Las asignaciones de unidades no abarcan a los usuarios, por lo que esto también podría ser un problema.

Sin más información, supongo que la cuenta con la que se ejecuta su servicio no tiene derechos para abrir el archivo para escribir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top