當我登錄我與威瑞信signtool.exe服務的組件,它失敗當機器啓動時,運行Windows 2003 Server的計算機上啓動。事件日誌有兩個事件:簽名程序阻止我的服務啓動
「超時(30000毫秒)等待XXX Service服務進行連接。」 和 「中的xxx服務服務啓動失敗由於以下錯誤: 該服務沒有及時啓動或控制請求。」
一旦機器運行就可以正常啓動。它在XP和Vista中開始很好。當程序集未簽名時它可以正常啓動。
當我登錄我與威瑞信signtool.exe服務的組件,它失敗當機器啓動時,運行Windows 2003 Server的計算機上啓動。事件日誌有兩個事件:簽名程序阻止我的服務啓動
「超時(30000毫秒)等待XXX Service服務進行連接。」 和 「中的xxx服務服務啓動失敗由於以下錯誤: 該服務沒有及時啓動或控制請求。」
一旦機器運行就可以正常啓動。它在XP和Vista中開始很好。當程序集未簽名時它可以正常啓動。
Authenticode簽署您的程序集可能會對冷啓動產生負面影響。有關詳細信息,請參閱此KB文章
正如Spacedog的說,驗證碼可以在啓動時壞的影響。所以問題是你在簽署什麼? Authenticode僅對您的服務可執行文件進行簽名就足夠了,而該服務可執行文件又只能引用強命名的程序集。因此驗證Authenticode簽名的開銷。
您可以將程序集安裝到GAC - 如果可能的話 - 這會略微提升啓動性能,因爲強名稱驗證會被忽略(請參閱Authenticode and Assemblies),或者如果啓動時間仍然是問題,您也可以啓動程序集。
從答案Windows service startup timeout由羅慕洛A. 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
你也可以嘗試告訴服務控制管理器(SCM),該服務需要額外的時間來啓動致電ServiceBase.RequestAdditionalTime
。
這個答案似乎混爲一談驗證碼簽名與強名稱簽名? – Dave 2009-02-16 22:05:36
這個問題對於簽署.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年7月:對於使用.NET Framework 4.0版的應用程序,不再需要此解決方法。
雖然安裝補丁,其中MS表示,它不測試不很動聽的生產系統... – 2009-02-16 22:25:57