2

サービス呼び出しを行う前に、WCF サービスが利用可能かどうかを知りたいです。最善の方法は何ですか?

これを使用するのはどうですか:

bool isServiceUp = true;
try
{
   string address = "http://localhost/MyService.svc?wsdl";

 MetadataExchangeClient mexClient = new MetadataExchangeClient(new Uri(address), MetadataExchangeClientMode.HttpGet);
   MetadataSet metadata = mexClient.GetMetadata();
// if service down I get the exception
}
   catch (Exception ex)
{
    isServiceUp = false;
} 

私のサービスは net tcp バインディングを使用しています。

net tcp バインディングに使用できますか?

編集: JaredPar に感謝します。最初の呼び出しが成功し、2 番目の呼び出し中にサーバーがダウンしたとします。したがって、サービス呼び出しを行う前に、OPEN 状態にあるプロキシの状態を確認するため、最終的にタイムアウトになるサービス呼び出しを行います。オープンまたはクローズのタイムアウトを設定していないため、デフォルトでは 1 分かかり、プロキシを破棄するサービスの Fault イベント ハンドラーで呼び出しがキャッチされます。しかし、その時までに UI がハングします。

ガイドしてください。

4

2 に答える 2

4

このタイプのテストはまったく不可能です。特定の WCF、または実際にネットワーク呼び出しが成功するかどうかを、試行する前に確実に検出する方法はありません。あなたのコントロール外にある変数が多すぎます。

  • 物理ネットワーク
  • WCF が実行されているマシンの電源
  • 実際の WCF プログラム
  • コードまたは WCF コードが実行されているコンピューターのハード ドライブの安定性

これらはいずれも、いつでも終了/変更できます。したがって、特定の呼び出しが成功するかどうかを予測することは不可能です。

この問題に対処する最善の方法は、失敗した場合を処理するコードを呼び出しに追加することです。

于 2012-06-04T16:46:29.740 に答える
0

以下のコードを試してみてください。うまくいきます。ServiceController クラスは「System.ServiceProces」名前空間に存在します。

try
{
    ServiceController sc = new ServiceController("Service Name", "Computer's IP Address");
    Console.WriteLine("The service status is currently set to {0}",
        sc.Status.ToString());

    if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
        (sc.Status.Equals(ServiceControllerStatus.StopPending)))
    {
        Console.WriteLine("Service is Stopped, Ending the application...");
        Console.Read();
        EndApplication();
    }
    else
    {
        Console.WriteLine("Service is Started...");
    }
}
catch (Exception)
{
    Console.WriteLine("Error Occurred trying to access the Server service...");
    Console.Read();
    EndApplication();
}
于 2014-03-11T22:14:55.373 に答える