使用できないマシンに接続しようとすると、EndpointNotFoundException が発生しますが、時間がかかりすぎます (約 20 秒)。closeTimeout、openTimeout、receiveTimeout、または sendTimeout を設定しても効果はありません。その例外を早期に取得できますか?
3 に答える
かなりうまく機能する EnterpriseLibrary ConnectionMonitor ブロックを使用しています。これにより、接続の可用性を判断するための独自の戦略を定義できますが、ボックスに付属しているものを使用しているだけです。
そのデフォルトコード(ブロックによって処理されるバックグラウンドスレッドで実行されます)はこれを内部的に使用します:
public bool IsAlive(string hostnameOrAddress)
{
bool alive = false;
try
{
Uri address = new Uri(hostnameOrAddress);
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(address);
request.Timeout = 5000;
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
{
alive = DoesResponseStatusCodeIndicateOnlineStatus(response);
}
}
catch (WebException wex)
{
alive = DoesWebExceptionStatusIndicateOnlineStatus(wex);
}
return alive;
}
ブロック自体を見て、プロジェクトで使用できるかどうかを確認したり、特定の問題を解決する方法についてアイデアを得たりしてください。(メモリから、ブロックは SCSF スマート クライアント ソフトウェア ファクトリの一部です)
ただし、何らかのバックグラウンド スレッドを実行するか、自分でタイムアウトを待つ必要があることを理解しています。WCF は、呼び出しがタイムアウトするまで、エンドポイントが存在しないことを認識しません。
いつでも別のスレッドで接続を試みることができ、メインスレッドで希望するタイムアウトのタイマーを設定できます。ワーカー スレッドがタイムアウト内に完了しない場合は、応答しないと想定できます。
見つかった解決策は、villinthaspamとwallismarkの回答を組み合わせたものです。リモート メソッドvoid IsOk()を非同期で呼び出し、数秒間待機するローカル メソッドを作成しました。時間がかかりすぎる場合は、スレッドを中止します。