2011-07-06 41 views
21

多くの場合、WCFエンドポイントが使用できない場合(通常はサービスホストが実行されていないため)、タイムアウト後にEndpointNotFoundExceptionが発生します。私は、通常のタイムアウトに頼ることなく、利用可能かどうかを確認するためにサービスに問い合わせるための迅速な方法を持っていたいと思います。言い換えれば、通常の状況では通常のタイムアウトを維持したいが、エンドポイントの迅速な「ping」のために、すぐに使用できない場合は速く失敗したい。WCFエンドポイントがリッスンしているかどうかを確認する最速の方法

これはどのように達成できますか?

答えて

8

TimeOut例外を待つ必要があります。 Proxyオブジェクトの作成時にTimeOutを設定(オーバーライド)できます。彼らは安いので、Pingの一時プロキシを作成します。

サーバー側では、(GetVersionのように)呼び出す軽量関数があることを確認できます。

+3

私がWCFをやっていたとき、私はちょうど 'void Ping()'を使いました; p –

4

状況を確認するには、次のようなソケット接続 スルーホストに接続しようとすることができます(そのvb.net 2.0のコードがあまりにもWCFで動作するはずです)

Dim sckTemp As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
    sckTemp.ReceiveTimeout = 500 : sckTemp.SendTimeout = 500 

    Try 
     '' Connect using a timeout (1/2 second) 
     Dim result As IAsyncResult = sckTemp.BeginConnect("Host_ADDRESS", YOUR_SERVER_PORT_HERE, Nothing, Nothing) 
     Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) 
     If (Not success) Then 
      sckTemp.Close() : Return False 
     Else 
      Return True 
     End If 
    Catch ex As Exception 
     Return False 
    End Try 

それは1/2であなたのサーバーの状態を与えます秒

+0

これは有望そうです。公平にするために、私は完全な設定については言及していませんでしたが、私はポート共有を使用しています。ここに別のアプローチがあるのは良いことです。 – Larsenal

+0

同時アクセスが発生すると問題が発生し、ForAll Parallelメソッドでテストを行い – Alexandre

2

変更したいのはSendTimeoutです。 私の特別なケースでは、FedExのパッケージ評価サービスであり、これは偶然にも金曜日の夜になると思われます。おそらく、偽のネガティブ(サービスが停止する)の重要度に応じて、タイムアウト値を慎重に検討する必要があります。

rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5); 

この値は、WCFクライアントに影響し、そのサービスのタイムアウトを永久に変更することはありません。

関連する問題