У меня есть две службы Windows, записанные в C# после тех же шаблонов и методологии.
Обе услуги были разработкой, протестированной против Windows 7 VM и QA, протестированного на Windows Server 2008 VM. Оба сервиса были установлены и много раз удалялись под этими тестовыми средами без проблемы, однако после установки в продуктивной среде (Windows Server 2008), один из этих двух сервисов отказывается запускаться.
Для установки сервисов, мы используем InstallUtil.exe с компонентами ServiceInstaller и ServiceProcessInstaller, присоединенными к сервису.
Судя по всему провальный сервис устанавливает успешно. InstallUtil.exe сообщает об успехе, и сервис появляется в Сервисном обрыве. Можно также определить местоположение сервиса в реестре под Вздором HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Blah. Однако, при попытке запустить сервис, Вы получаете следующее:
сетевой запуск blah.blah.exe "Сервисное название недопустим".
... или проходя Сервисный обрыв... "Windows не мог запуститься "И тому подобное" сервис на Локальный компьютер. Ошибка 1053: сервис не ответил на запуск или управлял запросом своевременно".
Я добавил некоторую регистрацию событий к конструктору класса обслуживания провальный сервис, но это, кажется, не называют.
Поскольку это - производственное поле, нет никакой Visual Studio на поле, и удаленная отладка вне рассмотрения.
Есть ли какой-либо другой способ для меня получить информацию об отладке на том, почему провальный сервис не запускается?
Есть ли какая-либо другая причина очевидного выхода, что я мог бы видеть этот вид проблемы?
Править: Я должен был также упомянуть.. Единственное другое доказательство проблемы в Windows Event Viewer является двумя сообщениями в Системном журнале от Диспетчера управления службами:
"Тайм-аут был достигнут (30 000 миллисекунд) при ожидании И тому подобное сервис для соединения.
"И тому подобное сервису не удалось запуститься из-за следующей ошибки: сервис не ответил на запуск или управлял запросом своевременно".
Править: Решенный вопрос закончил тем, что был комбинацией ошибки конфигурации и ошибки, которая скрывала его. См. мой ответ ниже для получения дополнительной информации.
Jeopardy Answer: «Как может недействительная настраиваемая конфигурация в сочетании с плохим глобальным обработчиком исключений проявиться в службе .NET Windows?»
Разобрался.
Основной причиной проблемы был недопустимый раздел пользовательской конфигурации в app.config. Мы используем настраиваемый раздел конфигурации для настройки службы из app.config, а сборка и пространство имен производного класса ConfigurationSection недавно изменились.
Как оказалось, наша производственная конфигурация искала определение настраиваемого ConfigurationSection в неправильной сборке, и исключение, выдаваемое при неспособности создать его экземпляр, скрывалось из-за ошибки, из-за которой исключения, обнаруженные на ранних этапах жизненного цикла службы, попытаться войти в пользовательский журнал, а не в журнал событий приложений. (Поскольку источник журнала событий не существует в настраиваемом журнале событий, это вызовет другое исключение из глобального обработчика исключений, и служба умрет в конструкторе.)
Это второе исключение нигде не регистрировалось, и мы только нашли это через проверку кода.
Решение состояло в том, чтобы исправить конфигурацию и изменить глобальный обработчик исключений, чтобы он пытался только записывать в журнал событий приложений, используя имя службы в качестве источника журнала событий. (InstallUtil регистрирует имя службы как источник журнала событий в журнале приложений.)
Всем спасибо за помощь! Извините, эта конкретная проблема оказалась настолько специфичной для нашей установки.
Это распространенная проблема. Какой код у вас в событии Start?
У вас должен быть только код, который активирует таймер при запуске службы. Это позволяет быстро завершить событие Start и уведомить контроллер. Если выполнение займет больше времени, вы получите полученную ошибку. Может быть какая-то причина (возможно, связанная с данными), почему это занимает больше времени в производстве.
Когда таймер тикает, выполните свой код и остановите таймер. Очевидно, также поместите все в try / catch и запишите исключения.
что вы пытаетесь сделать при запуске службы?
также проверьте учетную запись, через которую работает служба, и у этой учетной записи есть необходимые привилегии.
Я много раз сталкивался с подобными проблемами при программировании собственных сервисов, поэтому я просто перечислю кучу вещей, которые в разные моменты решали мои проблемы, и надеюсь, что они помогут вам :
Мне пришлось перезапустить services.msc, потому что я удалил службу, на которую, как он считал, есть ссылка. Однако, когда я запускал его, «служба была недействительной»
. Если вы создаете службу из консольного приложения (чтобы ее можно было отлаживать), но забываете вернуть ее обратно в службу, она не будет Начало.
Когда я использовал InstallUtil.exe, иногда он пытался установить несколько копий, поэтому я переключился на использование просто проекта установки.
Надеюсь, что это хоть как-то поможет.
Это могло быть возможно из сообщения об ошибке, которое вы описали
net start blah. blah.exe "Недействительное имя службы."
То, что вы дали сервису имя в компоненте установки сервиса, который вы добавили в Visual Studio, не то, что вы думаете.
У меня довольно много раз возникала эта проблема, когда разработчики неправильно называли службы в установках.