Почему StreamWriter не работает в службе Windows? - PullRequest
1 голос
/ 07 мая 2009

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

    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. Журнал просто не обновляется как следует. Есть идеи почему?

Ответы [ 4 ]

6 голосов
/ 07 мая 2009

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

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

2 голосов
/ 07 мая 2009

Без дополнительной информации никто не сможет помочь. Каким именно образом он не функционирует? Вы получаете исключение? Это просто молча терпит неудачу?

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

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 указывает на что-то специфическое для пользователя, например, отображение диска на общий сетевой ресурс. Сопоставления дисков не охватывают пользователей, поэтому это также может быть проблемой.

2 голосов
/ 07 мая 2009

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

  1. Constants.APP_PATH указывает на подключенный диск - службы не работают в той же среде, что и вошедший в систему пользователь, поэтому путь может быть недействительным
  2. Разрешения - в зависимости от того, от какого пользователя запущена служба, она может не иметь доступа к тому же набору каталогов, что и приложение WinForms
0 голосов
/ 07 мая 2009

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

...