私のWCFサーバーは定期的に上下する必要があり、クライアントはサーバーを使用することがありますが、サーバーがダウンしている場合、クライアントはそれを無視します。そのため、サーバーサービスを使用する必要があるたびに、接続状態を確認し、接続状態が開いていない場合は開きます。問題は、サーバーがダウンしているときに開こうとすると、パフォーマンスに影響を与える遅延が発生することです。私の質問は、ある種のmyClient.CanOpen()
を実行する方法はありますか?したがって、サーバーへの接続を開くポイントがあるかどうかはわかります。
WS-Discoveryの実装があり、サービスのアップ/ダウンアナウンスをリッスンできます。これは、クライアントで1つの設定アドレスを構成するのではなく、UDPマルチキャストメッセージを利用してサービスを見つけるため、非常に便利な形式のサービスアドレス解決でもあります。 WS-WCFの検出
Microsoftの従業員によって行われた実装もあります: WS-Discoveryサンプル実装
.NET4.0にはこれがネイティブに含まれます。 .NET 4.0の実装については、JesusRodriguezのブログで読むことができます。 WS-Discoで行われるアドホック通信の詳細を示す優れたチャートがあります WCF 4.0でのWS-Discoveryの使用
特にメッセージの大部分が一方向である場合に考慮すべきもう1つのことは、MSMQのようにネイティブに切断されて動作するプロトコルです。アプリケーションの設計がどのように見えるかはわかりませんが、MSMQを使用すると、サービスの状態に関係なくクライアントがメッセージを送信でき、サービスが復旧したときにメッセージを受信します。このように、クライアントは通信する前にサービスが稼働していることの確認を取得しようとしてそれほどブロックする必要はありません...それはただ起動して忘れてしまいます。
お役に立てれば。
ユーザーインターフェイスを備えたアプリケーションでサーバータイムアウトを予期して同期呼び出しを実行している場合は、別のスレッドで実行する必要があります。パフォーマンスの低下が例外のオーバーヘッドによるものではないかと思います。 CPU負荷、GUIの可用性、または実時間でパフォーマンスが低下しますか?
TCPでカスタムバインディングを作成できるかどうかを調査できますが、タイムアウトは速くなります。
とにかく応答を期待しないので、「IsOneWay = true」は要求->応答よりも速いことを知っていると思いますが、確認または戻り値を取得していません。要求->応答ではない双方向通信を実装することもできます。
これが私が使っているもので、それは魅力のように機能します。ところで、ServiceControllerクラスは名前空間 'System.ServiceProcess'にあります。
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();
}
クライアントにサーバー側の呼び出しを行って、サービスが開始されたことを通知することはできないと思います...私が見ることができる最善の方法は、サービスが開いているかどうかをクライアントメソッドに把握させることです。状態。 WCFのいくつかの機能が不足していない限り...
良いブログ投稿があります WCF:WCFサービスの可用性 読むことに興味がある場合。
ローカルネットワークにいる場合は、新しいサーバーが稼働していることを示す信号をブロードキャストできる可能性があります。クライアントはブロードキャスト信号をリッスンし、それに応じて応答する必要があります。