#windows-services #.net-2.0 #windows-server-2003-r2
#windows-services #.net-2.0 #windows-server-2003-r2
Вопрос:
У нас есть набор служб Windows .net 2.0, установленных на компьютере с Windows Server 2003 R2. Они настроены для запуска от имени учетной записи локальной системы, а режим запуска — автоматический. Сбой всех служб с ошибкой 1053 «Служба не ответила на запрос запуска или управления своевременно».
Я подключил ведение журнала к одной из служб и выяснил, что проблема находится за пределами нашего кода. Ни одна строка кода не выполнена.
Похоже, что проблема с разрешениями .net code на компьютере. Но проблема воспроизводится только на клиентском компьютере (два разных клиента с одинаковыми симптомами). В нашей среде разработчика и тестировщика мы не можем воспроизвести это.
Система для воспроизведения: ОС: Windows Server 2003 R2 с пакетом обновления 2 32-разрядной чистой установки предварительные требования к продукту: SQL Server 2005 Express с пакетом обновления 2, .NET Framework 2 с пакетом обновления 2 наш продукт
Что это может быть, какие-либо запросы?
обновление от 04.07.2011:
Файл с журналом ProcessMonitor с клиентского компьютера: http://dl.dropbox.com/u/8982352/Logfile.zip Имя процесса службы: ParsecServiceHost.exe
Комментарии:
1. Подключается ли служба к каким-либо внешним ресурсам (базе данных, серверу сокетов и т.д.), Которые, возможно, не настроены? Если он действительно подключается к каким-либо внешним ресурсам, можете ли вы подключиться к ним за пределами сервиса?
2. Метод OnStart службы не выполняется.
3. Есть ли в вашем классе службы статический ctor или какие-либо статические поля с выражениями инициализатора полей, которые могут вызывать исключения или занимать много времени при загрузке класса?
4. Класс Service не имеет статических конструкторов или полей, ведение журнала осуществляется с помощью static class, но я действительно уверен, что обработка исключений реализована там очень точно, и при инициализации класса logger и вызовах его методов не может возникнуть взаимоблокировок.
Ответ №1:
Наконец, сообщая об ответе, который помогла получить служба поддержки Microsoft:
Эта проблема возникает из-за того, что загрузка управляемой сборки .NET Framework 2.0, имеющей подпись Authenticode, занимает больше времени, чем обычно. Подпись всегда проверяется при загрузке управляемой сборки .NET Framework 2.0, имеющей подпись Authenticode.
Кроме того, загрузка управляемой сборки .NET Framework 2.0 может занять больше времени, чем обычно, из-за различных других настроек. Например, загрузка управляемой сборки .NET Framework 2.0 может занять больше времени, чем обычно, из-за конфигурации сети.
Вот Microsoft KB, которая описывает проблему и предоставляет исправление для .NET Framework 2.0, но это исправление не устраняет проблему длительного времени загрузки, а добавляет возможность просто отключить проверку подписи в .NET 🙂 установив параметр generatePublisherEvidence в app.config! Примечание: если у вас .NET Framework с пакетом обновления 2, то исправление не требуется, просто установите параметр generatePublisherEvidence в app.config.
http://support.microsoft.com/kb/936707 — ИСПРАВЛЕНИЕ: запуск управляемого приложения .NET Framework 2.0, имеющего подпись Authenticode, занимает больше времени, чем обычно.
Чтобы решить проблему, вы можете использовать этот параметр конфигурации, чтобы отключить проверку подписи в управляемом приложении .NET Framework 2.0. Вы можете использовать этот параметр конфигурации в файле конфигурации приложения. Для этого добавьте следующий код в файл .exe.config для управляемого приложения .NET Framework 2.0:
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
Если ваше приложение размещено в IIS, измените одно из следующих:
C:WindowsMicrosoft.NETFrameworkv2.0.50727aspnet.config
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachine.config
Примечание: На компьютерах x64 необходимо также изменить одно из следующих: C:WindowsMicrosoft.NETFramework64v2.0.50727aspnet.config C:WindowsMicrosoft.NETFramework64v2.0.50727CONFIGmachine.config
Ответ №2:
Когда служба запускается без проблем в win 7 / vista, я думаю, что проблема заключается в вашем коде, например, в вашем методе OnStart (). Обычно операции ввода-вывода в этом методе не разрешены, поэтому будьте осторожны с использованием потоков в этом методе.
Комментарии:
1. Не думаю, что это поможет, потому что все службы C запускаются отлично
2. Какую ОС вы используете на компьютере разработчика и тестировщика?
3. Мы установили Windows Server Standard 2003 r2 sp2 на тестовом компьютере и не смогли воспроизвести это поведение.
4. На наших компьютерах для разработчиков у нас Windows 7 и Vista, и мы никогда не сталкивались с этой проблемой.
5. тогда я думаю, что проблема в вашем коде. Как выглядит ваш метод OnStart ()? Поскольку операции ввода-вывода не разрешены в этом методе.
Ответ №3:
Вы не должны объявлять какие-либо ресурсы в конструкторе службы, которые будут использоваться в OnStart()
методе службы. По сути, конструктор запускается в самый первый раз, затем он содержит значения, которые будут использоваться в OnStart()
но затем после OnStop()
освобождения ресурсов, а затем то же самое нельзя использовать снова. Просто переместите весь код создания экземпляра из конструктора в OnStart()
, и он запустится.
Вот ссылка из MSDN для краткого ознакомления:http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onstart.aspx
В этом может быть еще одна проблема. Возможно, вы используете отладочную сборку. Службы не запускаются в режиме отладки, поэтому для запуска службы следует использовать сборку выпуска.
Комментарии:
1. «В этом может быть еще одна проблема. Возможно, вы используете отладочную сборку. Службы не запускаются в режиме отладки, поэтому для запуска службы следует использовать сборку выпуска.» Откуда эта информация, чувак?
2. «Вы не должны объявлять какие-либо ресурсы в конструкторе службы, которые будут использоваться в методе OnStart () службы. По сути, конструктор запускается в самый первый раз, затем он содержит значения, которые будут использоваться в OnStart (), но затем после onStop() ресурсы освобождаются, и затем то же самое нельзя использовать снова. Просто переместите весь код создания экземпляра из конструктора в OnStart (), и он запустится.» Пожалуйста, внимательно прочитайте вопрос: «Я подключил ведение журнала к одной из служб и выяснил, что проблема находится за пределами нашего кода. Ни одна строка кода не выполнена.»
3. Две проблемы, которые я упомянул в своем ответе, являются двумя наиболее распространенными проблемами, с которыми сталкиваются при работе со службами Windows. Если вы можете опубликовать свой OnStart () и код конструктора, тогда я мог бы быть в лучшем положении, чтобы обосновать свой ответ. Я уже дал ссылку для поддержки первой проблемы, в то время как вторая проблема, о которой я упоминал, возникла из моего прошлого опыта при решении проблемы 1053.
4. Джатин, спасибо за помощь! Я попытаюсь собрать тестовое решение, но проблема в том, что я не могу воспроизвести поведение в своей среде. Новая интересная информация: клиент разрешил подключение к Интернету на серверной машине (на каком-то автономном прокси-сервере), и службы начали запускаться нормально; когда клиент отказывает в подключении к Интернету — проблема возвращается.
5. Попробуйте одну вещь: вставьте весь код метода OnStart () в блок try и зафиксируйте ошибку в файле журнала, тогда мы могли бы получить лучшую идею.