Странная проблема с службой .NET Windows

У меня есть две службы Windows, написанные на С#, по тем же шаблонам и методологии.

Обе службы были протестированы на тестирование с использованием виртуальной машины Windows 7 и QA на виртуальной машине Windows Server 2008. Обе службы были установлены и удалены много раз в этих тестовых средах без проблем, однако при установке в рабочей среде (Windows Server 2008) одна из двух служб отказывается запускать.

Для установки сервисов мы используем InstallUtil.exe с компонентами ServiceInstaller и ServiceProcessInstaller, подключенными к этой службе.

По всей видимости, служба сбоев устанавливается успешно. Установщик InstallUtil.exe сообщает об успешном завершении работы, и служба появляется в оснастке "Службы". Вы также можете найти службу в реестре в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Blah Blah. Однако, если вы попытаетесь запустить службу, вы получите следующее:

net start blah.blah.exe Msgstr "Имя службы недействительно."

... или через snapin Services... "Windows не могла запустить службу" Blah Blah "на локальном компьютере. Ошибка 1053: служба не ответила на запрос запуска или управления своевременно".

Я добавил некоторое событие в журнал для конструктора службы сбоя службы сервиса, но он, похоже, не вызван.

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

Есть ли другой способ получить отладочную информацию о том, почему служба сбоя не запускается?

Есть ли какая-либо другая очевидная причина, что я могу видеть эту проблему?

Изменить: я должен был также упомянуть.. Единственное другое доказательство проблемы в Windows Event Viewer - это два сообщения в системном журнале из диспетчера управления службами:

"Тайм-аут был достигнут (30000 миллисекунд), ожидая подключения службы Blah Blah.

"Не удалось запустить службу Blah Blah из-за следующей ошибки: Служба не ответила на запрос запуска или контроля своевременно.

Изменить: разрешено Проблема закончилась тем, что была комбинацией ошибки конфигурации и ошибки, которая скрывала ее. Подробнее см. Мой .

Ответ 1

Jeopardy Answer: "Как может быть неправильная настраиваемая конфигурация в сочетании с плохой обработкой глобального обработчика исключений в службе .NET Windows?"

Выяснил это.

Основной причиной проблемы был недопустимый раздел настраиваемой конфигурации в app.config. Мы используем настраиваемый раздел конфигурации для настройки службы из app.config, и сборка и пространство имен производного класса ConfigurationSection недавно изменились.

Как оказалось, наша производственная конфигурация искала определение настраиваемого ConfigurationSection в неправильной сборке, а исключение, возникшее при попытке создать экземпляр, скрывалось от ошибки, в которой исключения, обнаруженные на раннем этапе службы, попытайтесь войти в пользовательский журнал, а не в журнал событий приложений. (Так как источник журнала событий не существовал в журнале пользовательских событий, это вызовет другое исключение из глобального обработчика исключений, и служба умрет в конструкторе.)

Это второе исключение нигде не регистрировалось, и мы нашли его только через проверку кода.

Решением было исправить конфигурацию и изменить глобальный обработчик исключений, чтобы попытаться записать в журнал событий приложения, используя имя службы в качестве источника журнала событий. (InstallUtil регистрирует имя службы в качестве источника журнала событий в журнале приложений.)

Спасибо за помощь всем! Извините, этот конкретный вопрос оказался настолько специфичным для нашей установки.

Ответ 2

Зависит ли служба, зависящая от службы, от запуска другой службы? Возможно, что зависимая служба не установлена ​​или не запущена в данный момент.

Ответ 3

что вы пытаетесь сделать при запуске службы?

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

Ответ 4

Это может быть возможно из сообщения об ошибке, которое вы описали

net start blah.blah.exe "Имя службы недействительно".

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

У меня была эта проблема несколько раз с разработчиками, использующими неправильные сервисы при установке.

Ответ 5

Я сталкивался с такими проблемами много раз, программируя свои собственные службы, поэтому я просто перечислю кучу вещей, которые в разных точках решают мои проблемы и надеюсь, что они вам помогут:

  • Мне пришлось перезапустить services.msc, потому что я удалил сервис, который все еще считал ссылкой на него. Однако, когда я начну его, "служба была недействительной"

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

  • Когда я использовал InstallUtil.exe, иногда он пытался установить несколько копий, поэтому я переключился на использование Project Setup.

Надеюсь, что это поможет в некотором роде.

Ответ 6

Это обычная проблема. Какой код у вас есть в событии Start?

У вас должен быть только код, который активирует таймер при запуске службы. Это позволяет быстро запускать событие Start и уведомлять контроллер. Если выполнение занимает больше времени, вы получите полученную вами ошибку. Возможно, есть какая-то причина (возможно, связанная с данными), почему она занимает больше времени в производстве.

Когда таймер тикает, выполните свой код и остановите таймер. Очевидно, что также поместите все в try/catch и запишите исключения.

Ответ 7

Возможно, эта ошибка возникнет, когда

  • ваша услуга зависит от другой службы/приложения.
  • или из-за недействительных конфигураций app.config

Обнаружена та же проблема, когда Entity Framework не удалось подключиться к серверу базы данных из-за отсутствия разрешения. Лучше добавить механизм ведения журнала ошибок на глобальном уровне в приложение, чтобы легко отладить проблему. В некоторых сценариях может не отображаться точная информация.