Подписанные сборки не позволяют запустить мой сервис - PullRequest
6 голосов
/ 17 февраля 2009

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

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

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

Ответы [ 3 ]

5 голосов
/ 12 марта 2010

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

Чтобы решить эту проблему, отключите проверку подписи Authenticode во время загрузки, чтобы создать свидетельство Publisher , добавив следующие элементы в файл .exe.config:

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

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

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

2 голосов
/ 17 февраля 2009

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

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

1 голос
/ 17 февраля 2009

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

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

Из ответа на Тайм-аут запуска службы Windows от Ромуло А. Ceccon:

Это хорошая практика, чтобы закончить старт Ваш сервис как можно быстрее. Так, в начальном состоянии делать только то, что вам абсолютно необходимо признать это начался успешно; и делать все остальное потом. Если начало еще долго обрабатывать, использовать SetServiceStatus периодически информировать Сервис Control Manager, которого у вас еще нет закончили, так что не сервис.

В дополнение к SetServiceStatus вы также можете попытаться сообщить диспетчеру управления службами (SCM), что для запуска службы требуется дополнительное время, позвонив по номеру <a href="http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx" rel="nofollow noreferrer">ServiceBase.RequestAdditionalTime</a>.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...