2

多数のサービスを使用するクライアント アプリケーションがあります。サービスがダウンしているか、正しく構成されていないかは、すぐにわかるとは限りません。私はほとんどのサービスのサービス側コードとホスティングを所有していますが、すべてではありません。これはクライアント プロキシの実際の混合バッグです。さまざまなバインディング (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() メソッドを実装していることを知っていれば可能かもしれませんが、一部のサービスは制御できないため、それを行うことさえできません。

では、このような単純な汎用汎用サービス チェッカーを作成することさえ可能でしょうか? もしそうなら、どのように?(もしそうでなければ、なぜですか?)

ありがとう!

4

2 に答える 2

1

WCFディスカバリーを見たことがありますか?

WCFディスカバリーを使用すると、クライアントは、コントラクトタイプ、バインディング要素、名前空間、スコープ、キーワードまたはバージョン番号などのさまざまな基準に基づいてサービスを検索できます。WCFディスカバリーは、実行時および設計時のディスカバリーを可能にします。アプリケーションに検出を追加すると、フォールトトレランスや自動構成などの他のシナリオを有効にするために使用できます。

最初の試みとして、エンドポイントにクエリを実行して、期待されるコントラクトをサポートしているかどうかを確認できます。

大きな利点は、実行時にどのサービスと通信したいかをクライアントに「発見」させることができることです。これにより、見慣れている可能性のあるクライアント側の構成エラーの多くが削除されます。

于 2012-09-28T16:53:35.583 に答える
0

SO-AWAREをチェックアウトする必要があります。これは、組織全体で SOAP または REST WCF ベースのサービスを管理できる Web サービス管理ツールです。さらに、Test Workbench があります。

これを示すビデオもいくつかあります。

概観すると、これは非常に複雑で、これらの人々はそれで生計を立てています。現実的に自分で構築したいものではないと思います。

于 2012-09-28T13:01:34.853 に答える