C # сервис не будет писать в XML - PullRequest
0 голосов
/ 26 января 2012

Я только что написал тестовый сервис на C # 2010. В методе OnStart я открываю XML-документ в корне диска C:, анализирую его и записываю в другой XML-документ, также в корне C: диск.

Когда я устанавливаю службу и запускаю ее, мне сказали, что она снова автоматически остановилась. Выходной XML-файл создан, но пуст. Я запускаю службу в качестве учетной записи локальной системы.

Может кто-нибудь сказать мне, почему не пишется никакого контента?

Спасибо

РЕДАКТИРОВАТЬ (чтобы включить код для OnStart) ...

protected override void OnStart(string[] args)
{
    String win32ClassName = "";
    String nodeSubkeyName = "";
    List<String> propertyList = new List<String>();
    List<String> propertyListQuery = new List<String>();

    XmlTextReader reader = new XmlTextReader("C:\\hwin.xml");
    XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null);
    writer.WriteStartDocument();
    writer.WriteComment("Asset hardware Inventory for " + System.Environment.MachineName);
    writer.WriteStartElement("hardware");

Приведенный выше код даже не записывает начальный элемент для выходного XML-файла, но он создает пустой файл, поэтому подозреваю, что у него есть на это права. Возможно, чтение входного файла является проблемой? Я почти не представляю, как работает учетная запись Local Service!

Ответы [ 5 ]

1 голос
/ 26 января 2012

Я подозреваю, что он не очищает поток, в который пишет.Потоковый вывод (включая вывод файла) обычно буферизуется, потому что он дает лучшую производительность для пакетирования байтов для записи в файл, а не для выполнения их по одному.(Преимущество увеличивает объем используемого вами буфера до 4 или 8 Кбайт, после чего стоимость используемой памяти перевешивает выигрыш. 4 и 8 имеют тенденцию быть лучше, чем что-то среднее, потому что они также хорошо влияют на размеры страниц памяти, вв любом случае буферы по умолчанию для большинства потоков, предоставляемых фреймворком, равны 4k).

В любом случае, если это проблема, вам необходимо очистить поток.Это всегда делается, когда вы закрываете писатель, а закрытие писателя всегда выполняется, когда вы Dispose() его.Вы всегда должны утилизировать все, что реализует IDisposable, как можно скорее, в качестве хорошей практики (всегда предполагайте, что что-то плохое, по крайней мере, может произойти, если вы этого не сделаете, даже в тех случаях, когда вы знаете, что данный Dispose() в настоящее времяреализован как неоперативный).В большинстве случаев это проще всего сделать с помощью блока:

using(XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null))
{
  //code that uses writer here
}

Даже если мое подозрение ошибочно, стоит попробовать сделать это.

0 голосов
/ 26 января 2012

Возможно, необработанное исключение ....

Используйте Try / Catch, запишите исключение в system.diagnostics.trace.writeline и используйте DebugView (http://technet.microsoft.com/en-us/sysinternals/bb896647) для чтения вывода.

0 голосов
/ 26 января 2012

Трудно сказать без фрагмента кода, но если служба не запускается определенным образом, исключение выдает OnStart, поместите Thread.Sleep в метод OnStart, подключитесь к процессу с помощью Visual Studio и debug

0 голосов
/ 26 января 2012

Вы пытались выполнить свой код как консольное приложение, а не как службу?

Часто проблемы во время выполнения со службами возникают из-за привилегий.Что касается написания, это не так, потому что ваш код должен создать выходной файл XML.Таким образом, ваша служба имеет права на запись в правильный каталог.

Но может случиться так, что у нее нет прав на чтение входного файла, или во время выполнения может произойти исключение.

Мой вам совет:

  • протестируйте ваш код как консольное приложение, а не как службу, и протестируйте его из Visual Studio
  • try / catch и зарегистрируйте любые исключения
  • проверьте программу просмотра событий, чтобы узнать, зарегистрировала ли Windows какие-либо сведения о проблеме с вашим сервисом
0 голосов
/ 26 января 2012

Проверьте журнал ошибок в средстве просмотра событий. Скорее всего, у вас нет разрешения на чтение файла из c: \

. Службу можно запустить под учетной записью, у которой есть разрешение на чтение \ запись.to c: \

Вы должны попытаться обойти блок xml write code, а затем записать ошибку для дальнейшей отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...