Вопрос

У меня есть этот простой код, который записи добавляет журнал в текстовый файл:

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

Это прекрасно работает в приложении Windows Forms. Однако, используя instsrv и srvany , я сделал это службой Windows. Служба работает нормально, получает доступ к базе данных, выполняет запросы и все ... За исключением этого StreamWriter. Журнал просто не обновляется как следует. Есть идеи почему?

Это было полезно?

Решение

Скорее всего, служба работает под учетными данными пользователя, у которого нет прав доступа к этому каталогу.

Поэтому проверьте диалоговое окно свойств службы и откройте вкладку «Вход в систему», чтобы увидеть, как она входит в систему.

Другие советы

Возможные причины:

<Ол>
  • Constants.APP_PATH указывает на подключенный диск - службы не работают в той же среде, что и вошедший в систему пользователь, поэтому путь может быть недействительным
  • Разрешения - в зависимости от того, от какого пользователя запущена служба, она может не иметь доступа к тому же набору каталогов, что и приложение WinForms
  • Без дополнительной информации никто не сможет помочь. Каким именно образом он не функционирует? Вы получаете исключение? Это просто молча терпит неудачу?

    Просто пара советов ...

    1) Не используйте конкатенацию строк для создания путей к файлам. Вместо этого используйте System.IO.Path.Combine . Вот так:

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

    2) Заключите ваш писатель в блок using () . Вот так:

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

    3) Убедитесь, что учетная запись, используемая службой, имеет доступ для создания / перезаписи файлов в этом каталоге. Часто учетные записи служб, такие как LOCAL_SYSTEM или NETWORK_SERVICE , не будут иметь такие же разрешения, как учетные записи пользователей. Это может объяснить, почему он работает как пользователь, а не как сервис. Также может быть, что ваша константа APP_PATH указывает на что-то специфическое для пользователя, например, отображение диска на общий сетевой ресурс. Сопоставления дисков не охватывают пользователей, поэтому это также может быть проблемой.

    Без дополнительной информации я бы предположил, что учетная запись, под которой работает ваша служба, не имеет прав на открытие файла для записи.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top