サービスの起動時に例外を処理する
-
03-07-2019 - |
質問
一連のWindowsサービスを書いています。 ( OnStart()
メソッドで)起動時にエラーがスローされた場合、それらを失敗させます。 OnStart()
でエラーをスローするだけでこれができると想定していましたが、代わりに" Starts"を見つけました。 "サービスは開始されましたが、非アクティブですというメッセージが表示されます。これは正しいですか?" (言い換え)。実際にサービスの開始に失敗するようにエラーを処理するにはどうすればよいですか?
解決
.NET 2.0以降を実行している場合は、 ServiceBase.Stop でOnStartからサービスを停止します。それ以外の場合は、新しいスレッドからStopを呼び出します。
ref [devnewsgroups]( http:/ /www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )
(ニュースグループは削除されました)
他のヒント
サービスウィンドウでエラーが発生したことを報告したい場合(Windows 7の.net 3.5)、ExitCodeを設定する方法が唯一の方法です。 「不明なエラーが発生しました」というメッセージが表示されるため、13816に設定することをお勧めします。 Windowsエラーコードを参照してください。
以下のサンプルは3つのことを達成します。 1-ExitCodeを設定すると、エンドユーザーに役立つメッセージが表示されます。 Windowsアプリケーションログには影響しませんが、システムログにメッセージが含まれます。 2-停止を呼び出すと、「サービスが正常に停止しました」という結果になります。アプリケーションログのメッセージ。 3-例外をスローすると、アプリケーションログに有用なログエントリが作成されます。
protected override void OnStart(string[] args) {
try {
// Start your service
}
catch (Exception ex) {
// Log exception
this.ExitCode = 13816;
this.Stop();
throw;
}
}
すべての起動ロジックを個別のメソッドに移動し、その個別のメソッドから例外をスロー(またはOnStopを呼び出し)します。
OnStartの起動時の奇妙な点がいくつかあります。 OnStart()に1行しか含まれていない場合、「サービスを開始してから停止する」というメッセージが表示されないことがわかりました。メッセージ、スローされた例外はプロセスを終了し、アプリのイベントログに記録します。
別の起動方法でも、このような手法を使用して、アタッチせずにデバッグできます。 http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx