2012-01-26 2 views
0

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

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

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

Спасибо,

EDIT (включая код 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!

+0

поэтому он фактически записывает файл на диск? но он пуст .. очень странно! – iwayneo

+0

Угадайте, что вы закрыли WriteStartElement с помощью WriteEndElement, а также закрыли запись, как только закончите. – Rajesh

+0

Я думаю, что это проблема права на созданный файл. Опубликовать небольшую часть кода, может быть, мы сможем помочь вам – h1ghfive

ответ

0

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

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

+0

Оказалось, что это необработанное исключение в том, что я читал для XML. – Simon

0

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

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

Вы должны использовать попытку и поймать свой блок кода xml write, а затем зарегистрировать ошибку, чтобы отладить это дальше.

+0

Я думал, что учетная запись Local Service будет иметь разрешения на C: (или любую часть диска)? Разве это не так? – Simon

+0

Скорее всего нет, я не помню - проще всего открыть панель обслуживания и изменить пользователя, на котором работает сервер, и изменить его свою учетную запись, которая может читать и записывать файл на c: \. если это изменение работает, то вы точно знаете его разрешение. долгосрочное исправление, вы должны иметь ошибки try и catch и log –

+1

Обычно я нахожу лучший способ написать услуги, чтобы поместить всю вашу логику в библиотеку классов ... затем во время разработки я использую библиотеку классов с консольным приложением. .. и также использовать тот же код для службы wndows. Пример MyClassLibrary.RunInstance() ... это весь код, который мне нужно добавить в консольное приложение и службу Windows. Остальная часть кода - это библиотека классов. Гораздо проще отладить это было и намного быстрее, вместо постоянной компиляции, установки и удаления службы. –

0

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

0

Вы пробовали выполнение вашего код как консольное приложение, а не сервис?

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

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

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

  • тест ваш код в качестве консольного приложения, а не службы, и протестировать его изнутри Visual Studio
  • TRY/улова и войти каких-либо исключений
  • Проверьте событие просмотра, чтобы увидеть, если окна подключился какой-либо деталь о проблеме с вашими услугами
+0

Да, код работает отлично как консольное приложение. Я отправлю код в своем исходном сообщении. – Simon

1

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

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

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

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

Смежные вопросы