签名的程序集阻止我的服务启动

Won*_*nko 6 .net service code-signing

当我使用Verisign signtool.exe在我的服务中对程序集进行签名时,它在计算机启动时无法在运行Windows 2003 Server的计算机上启动.事件日志有两个事件:

"等待xxx服务连接的超时(30000毫秒)." 并且"由于以下错误,xxx服务服务无法启动:服务未及时响应启动或控制请求."

一旦机器运行,它就会正常运行.它在XP和Vista中都很好用.当程序集未签名时,它会正常启动.

mdb*_*mdb 5

对于已签名的.NET服务可执行文件,此问题非常常见:该服务将无法在启动时启动,但随后手动启动时运行良好。是否使用ServiceBase.RequestAdditionalTime无关紧要:实际上,在服务启动请求超时之前根本不执行任何用户代码。在没有Internet连接的计算机上,这种影响更加明显:在这种情况下,即使从SCM手动启动服务也会失败。

要解决此问题,请在加载时禁用Authenticode签名的验证,以便通过将以下元素添加到您的.exe.config文件中来创建Publisher证据

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

发布者证据是很少使用的代码访问安全性(CAS)功能:仅当您的服务依赖PublisherMembershipCondition禁用它时,才会引起问题。在所有其他情况下,它将不再需要运行时执行昂贵的证书检查(包括吊销列表查找),从而消除了永久性或间歇性启动失败。

编辑,2010年7月:对于使用.NET Framework 4.0版的应用程序,不再需要此解决方法。


Two*_*ter 2

对程序集进行 Authenticode 签名可能会对冷启动产生非常负面的影响。有关详细信息,请参阅此知识库文章。

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