2011-12-20 31 views
4

特定のネットパイプサービスが実行中で、リッスンしているかどうかをプログラムでテストして、「リッスンしているエンドポイントはありません。 "例外?ネットパイプサービスがリッスンしているかどうかを確認するにはどうすればよいですか

Uri baseAddress = new Uri("http://localhost/something"); 
var _ServiceHost = new ServiceHost(typeof(Automation), new Uri[] { baseAddress }); 
NetNamedPipeBinding nnpb = new NetNamedPipeBinding(); 
_ServiceHost.AddServiceEndpoint(typeof(IAutomation), nnpb, "ImListening"); 
_ServiceHost.Open(); 

私は別のアプリケーションから必要http://localhost/something/ImListeningとの通信が、私はそう聞いているを確認する前に、私は例外を取得、またはしていないが例外である:

だから例えば私はこのコードを持っている場合これをテストする唯一の方法は?

答えて

1

例外をリッスンします。そのです。

+0

私は実際にはこのサービスのために_wait_する必要があります。私はそれと通信する同じコードから起動しますので、サービスでダミーメソッドを作成して停止するまで呼び出す必要があります例外が発生していますか? – Juan

+0

多くのデータをサービスに送信しているのでなければ、最初に連絡しようとしている方法に連絡するだけではどうですか? (例外的に遅延が繰り返されているのは明らかです) – Amadan

+0

私のサービスでまだ呼び出す方法はわかりません。私はまた、それが失敗しない限り、チャンネルを開いたままにしたい。多分私はここで 'ミューテックス'を使うことができました。とにかく、私は、サービスが既に実行されているかどうかを私のアプリが知りたいです。後でこれを使用していくつかのボタンやそのようなものを有効/無効にすることができます。 – Juan

1

例外が存在するため、私はあなたがそれを処理する限り、ユーザが回避しようとしているものと思われる謎めいたエラーメッセージが表示されない限り、例外を処理します。

0

おそらく、最良の方法ではありませんが、NetNamedPipeを使用してエンドポイントをテストする別の方法は見つかりませんでした。 InvokeSafeだけのコレクションがnullと空の異なる場合ActionHasElementsはちょうどテストを実行するためのtry/catchで、このコードで

public void IsValid() 
    { 
     RegisterConfiguration(); 

     var endPoints = Host.Description.Endpoints; 
     if (!endPoints.HasElements()) 
     { 
      throw new NullReferenceException("endpoints (WCF Service)."); 
     } 

     foreach (var item in endPoints) 
     { 
      var service = new ChannelFactory<ITcoService>(item.Binding, item.Address); 
      try 
      { 
       var client = (IClientChannel)service.CreateChannel(); 

       try 
       { 
        client.Open(TimeSpan.FromSeconds(2)); 
        throw new InvalidOperationException(
         string.Format(
          "A registration already exists for URI: \"{0}\" (WCF Service is already open in some IChannelListener).", 
          item.Address)); 
       } 
       catch (Exception ex) 
       { 
        if (ex is System.ServiceModel.CommunicationObjectFaultedException || 
         ex is System.ServiceModel.EndpointNotFoundException) 
        { 
         Debug.WriteLine(ex.DumpObject()); 
        } 
        else 
        { 
         throw; 
        } 
       } 
       finally 
       { 
        new Action(client.Dispose).InvokeSafe(); 
       } 
      } 
      finally 
      { 
       new Action(service.Close).InvokeSafe(); 
      } 
     } 
    } 

(申し訳ありません拡張メソッド:

は、私は通常、このアプローチを行います)。

関連する問題