2

dll のインポートと pinvoke を介して従来の C++ コードを使用している自己ホスト型の wcf サービスがあります。古いコードには、関数 (古いアプリでは処理されたが、サービスでは処理されなかった) から例外が発生し、それらが発生するとサービスが停止する場合があります。例外はまれです。ただし、別のアセンブリでのクラッシュの結果としてサービスがランダムに停止することは望ましくありません。例外はサービスにバブリングしていないため、サービスでそれらを試したりキャッチしたりすることはできません。クラッシュ時にサービスを自動的に再起動する方法はありますか?

IIS 経由ではなく、自己ホスト型です。

前もって感謝します!!

4

2 に答える 2

4

サービスが実行されているマシンで、サービス管理コンソールを開くことができます (開始 > 実行 > services.msc)。サービスを見つけて右クリックし、[プロパティ] を選択します。ポップアップで、[リカバリ] タブをクリックします。1 回目、2 回目、およびその後の失敗のすべてをサービスの再起動に設定します。

プロジェクトのインストールに WIX を使用している場合は、util:ServiceConfig要素を使用してこれらのプロパティを設定することもできます。

標準の ServiceInstaller を使用している場合、これらのオプションは組み込まれていません。標準のサービス インストーラー インターフェイスを介してプロパティを公開するServiceInstaller Extensionクラスを確認することをお勧めします。

于 2012-11-06T15:11:16.060 に答える
1

さて、私はあなたがあなたがしていることのためにWindowsサービスプロジェクトを作成していると仮定しています。ProjectInstallerに移動し、「AfterInstall」メソッドを見つけます。ここでは、回復オプションを設定するためにServiceControllerでコマンドを実行するためのコードを追加する必要があります。残念ながら、.NETにはServiceControllerがありますが、プロセスの開始を通じてコマンドを実行する必要があります。

using (var process = new Process())
{
    var startInfo = process.StartInfo;
    startInfo.FileName = "sc";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;

    // tell Windows that the service should restart if it fails
    startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

    process.Start();
    process.WaitForExit();

    exitCode = process.ExitCode;

    process.Close();
}

注:私は別の質問からこのコードを盗みました

于 2012-11-06T15:08:10.467 に答える