多数のサービスを使用するクライアント アプリケーションがあります。サービスがダウンしているか、正しく構成されていないかは、すぐにわかるとは限りません。私はほとんどのサービスのサービス側コードとホスティングを所有していますが、すべてではありません。これはクライアント プロキシの実際の混合バッグです。さまざまなバインディング (basichttp/wshttp/nettcp) があり、svcutil.exe を使用して生成されたものもあれば、コントラクトが共通のアセンブリにある ChannelFactory を使用してプログラムで作成されたものもあります。ただし、アドレス、バインディング、および契約には常にアクセスできます。
クライアント アプリケーションに、バインディング/エンドポイントの構成とサービスの可用性の基本的なチェックを実行できる単一のコンポーネントを用意したいと考えています (クライアントの診断パネルに表示するため)。少なくとも、構成されたアドレスにエンドポイントがあることを知りたいだけです。さらに良いのは、エンドポイントが応答しており、クライアントが使用しようとしているバインディングをサポートしているかどうかを確認することです。
私はグーグルを試してみましたが、例が見つからないことに驚きました (すでに悪い兆候かもしれません) が、それほど難しいことではないと考えました。 close() は発生した例外をキャッチし、必要に応じて abort() します。
私は間違っていました - 特に、BasicHttpBinding を使用しているクライアントでは、任意のエンドポイント アドレスを指定でき、例外なく開いたり閉じたりすることができます。
これは私の実装の縮小版です。実際には、例外のタイプとエンドポイント アドレスに関するもう少し詳細な情報を返していますが、これが基本的な構造です。
public class GenericClientStatusChecker<TChannel> : ICanCheckServiceStatus where TChannel : class
{
public GenericClientStatusChecker(Binding binding, EndpointAddress endpoint)
{
_endpoint = endpoint;
_binding = binding;
}
public bool CheckServiceStatus()
{
bool isOk = false;
ChannelFactory<TChannel> clientChannelFactory = null;
IClientChannel clientChannel = null;
try
{
clientChannelFactory = new ChannelFactory<TChannel>(_binding, _endpoint);
}
catch
{
return isOk;
}
try
{
clientChannel = clientChannelFactory.CreateChannel() as IClientChannel;
clientChannel.Open();
clientChannel.Close();
isOk = true;
}
catch
{
if (clientChannel != null)
clientChannel.Abort();
}
return isOk;
}
}
[Test]
public void CheckServiceAtNonexistentEndpoint_ExpectFalse()
{
var checker = new GenericClientStatusChecker<IDateTimeService>(new BasicHttpBinding(), new Endpointaddress("http://nonexistenturl"));
// This assert fails, because according to my implementation, everything's ok
Assert.IsFalse(checker.CheckServiceStatus());
}
ClientBase を実装したダミーの testclient クラスでも同様の手法を試しましたが、結果は同じでした。すべてのサービス コントラクトが共通の CheckHealth() メソッドを実装していることを知っていれば可能かもしれませんが、一部のサービスは制御できないため、それを行うことさえできません。
では、このような単純な汎用汎用サービス チェッカーを作成することさえ可能でしょうか? もしそうなら、どのように?(もしそうでなければ、なぜですか?)
ありがとう!