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