6

When I sign the assemblies in my service with the Verisign signtool.exe, it fails to start when the machine starts, on a machine running Windows 2003 Server. The event log has two events:

"Timeout (30000 milliseconds) waiting for the xxx Service service to connect." and "The xxx Service service failed to start due to the following error: The service did not respond to the start or control request in a timely fashion."

It starts fine once the machine is running. It starts fine in XP and Vista. It starts fine when the assemblies are unsigned.

4

3 に答える 3

6

この問題は、署名された .NET サービス実行可能ファイルで非常に一般的です。サービスは起動時に開始されませんが、後で手動で開始すると正常に実行されます。ServiceBase.RequestAdditionalTime が使用されるかどうかは関係ありません。実際、サービス開始要求がタイムアウトする前に、ユーザー コードはまったく実行されません。この影響は、インターネットに接続されていないマシンではさらに顕著です。その場合、SCM から手動でサービスを開始しても失敗します。

この問題を解決するには、次の要素を .exe.config ファイルに追加して、読み込み時の Authenticode 署名の検証を無効にして、Publisher の証拠を作成します。

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

発行元の証拠は、ほとんど使用されていないコード アクセス セキュリティ (CAS) 機能です。サービスが PublisherMembershipCondition に依存している場合にのみ、それを無効にすると問題が発生します。それ以外の場合はすべて、ランタイムがコストのかかる証明書チェック (失効リストの検索を含む) を実行する必要がなくなるため、永続的または断続的な起動エラーが解消されます。

編集、2010 年 7 月: .NET Framework のバージョン 4.0 を使用するアプリケーションの場合、この回避策は不要になりました。

于 2010-03-11T21:28:40.480 に答える
2

アセンブリに署名する Authenticode は、コールド スタートアップに非常に悪影響を及ぼす可能性があります。詳細については、この KB 記事を参照してください。

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

于 2009-02-16T21:50:22.387 に答える
1

spacedog が言ったように、Authenticode は起動時間に悪影響を与える可能性があります。問題は、何に署名しているのかということです。厳密な名前のアセンブリのみを参照する必要があるサービス実行可能ファイルのみに Authenticode 署名するだけで十分です。したがって、Authenticode 署名を検証するオーバーヘッド。

アセンブリを GAC にインストールできます - 可能であれば - これにより、厳密な名前の検証がスキップされるため、起動時のパフォーマンスがわずかに向上します ( Authenticode とアセンブリを参照)。

Romulo A. Ceccon によるWindows サービスの起動タイムアウトへの回答から:

サービスの開始をできるだけ早く終了することをお勧めします。したがって、開始状態の間は、正常に開始されたことを確認するために絶対に必要なことだけを行います。残りは後で行います。開始がまだ長いプロセスである場合は、定期的に SetServiceStatus を使用して、まだ終了していないことをサービス コントロール マネージャーに通知し、サービスがタイムアウトにならないようにします。

に加えてSetServiceStatus、 を呼び出して、サービスの起動に追加の時間が必要であることをサービス コントロール マネージャー (SCM) に伝えることもできますServiceBase.RequestAdditionalTime

于 2009-02-16T22:02:05.730 に答える