2009-02-16 4 views
5

Когда я подписываю сборки в своей службе с помощью Verisign signtool.exe, он не запускается при запуске машины на компьютере под управлением Windows 2003 Server. Журнал событий имеет два события:Подписанные сборки не позволяют моему сервису начинать

«Таймаут (30000 миллисекунд), ожидающий соединения службы xxx для подключения». и «Служба службы xxx не удалось запустить из-за следующей ошибки: Служба не ответила на запрос запуска или управления своевременно».

Он запускается нормально, как только машина работает. Он отлично работает в XP и Vista. Он начинается нормально, когда сборки не имеют знака.

ответ

2

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

http://support.microsoft.com/default.aspx/kb/936707

+0

Хотя установка патча, где MS говорит, что он не протестирован, не звучит очень привлекательно для производственной системы ... –

1

Как сказал Spacedog, Authenticode может иметь плохое влияние на время запуска. Итак, вопрос в том, что вы подписываете? Достаточно, чтобы Authenticode подписывал только ваш исполняемый файл службы, который, в свою очередь, должен ссылаться только на сильные узлы. Таким образом, накладные расходы на проверку подписи Authenticode.

Вы можете установить свои сборки в GAC - если это возможно - это немного повысит производительность запуска, потому что сильная проверка имени будет пропущена (см. Authenticode and Assemblies) и/или вы также можете создать свои сборки, если время запуска все еще является проблемой.

Из ответа на Windows service startup timeout Ромуло А. Ceccon:

It's good practice to finish starting your service as fast as possible. So, during the start state, do only what you absolutely need to acknowledge it started successfully; and do the rest later. If the start is still a lengthy process, use SetServiceStatus periodically to inform the Service Control Manager that you have not yet finished, so it does not time-out your service.

В дополнение к SetServiceStatus вы также можете попробовать сказать Control Manager Service (SCM), что услуга требуется дополнительное время, чтобы начать по телефону ServiceBase.RequestAdditionalTime.

+0

Этот ответ, похоже, связывает подписи Authenticode с сильными сигнатурами имен? – Dave

+1

Nope. В каком смысле? –

+0

(продолжение) При использовании Authenticode достаточно, чтобы ссылочные сборки были подписаны с сильным именем. Я пытался найти ссылку, к сожалению, я только нашел это сообщение: http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/493aca7f-b5ea-4462-a15f-affe874bfe44/ –

4

Эта проблема очень распространена для подписанных исполняемых файлов .NET: служба не запускается во время загрузки, но работает нормально при запуске вручную. Используется ли ServiceBase.RequestAdditionalTime, не имеет значения: фактически, ни один пользовательский код не выполняется вообще до истечения времени ожидания запроса на запуск службы. Этот эффект еще более выражен на машинах без подключения к Интернету: в этом случае даже ручной запуск службы из SCM не удастся.

Чтобы решить эту проблему, disable the verification of the Authenticode signature at load time in order to create Publisher evidence, добавив следующие элементы в файл .exe.config:

<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

Издатель доказательством является малопользованной безопасностью доступа к коду (CAS) особенность: только если вашей служба полагается на PublisherMembershipCondition, что приведет к его отключению. Во всех других случаях это приведет к тому, что постоянные или прерывистые сбои при запуске исчезнут, больше не требуя, чтобы среда выполнения выполняла дорогостоящие проверки сертификатов (включая поиск списков списков).

Редактировать, Июль 2010: Для приложений, использующих версию 4.0 .NET Framework, это обходное решение больше не требуется.