0

WCFサービスとクライアントのペアがあります。クライアントのファクトリメソッドでOpen()を呼び出して、呼び出す前にサービスが利用可能であることを確認してきました。何かのようなもの:

MyClient GetClient() 
{
    MyClient client = new MyClient();
    try
    {
        client.Open();
        return client;
    }
    catch(Exception)
    {
        //perform an (important) error-handling here
    }
}

このように、発信者コードは次のようになります。

client = factory.GetClient();
client.CallMethodInTheService();

また、エラー処理について心配する必要はありません。

これは、wshttpbindingでセキュリティモードをWindowsに設定し、clientCredentialTypeをWindowsに設定した場合に機能します。client.Open()は、サービスが利用できない場合に例外をスローするため、エラー処理コードが実行されます。ただし、現在、Windowsクレデンシャルベースのセキュリティを使用できない環境に展開しているため、セキュリティモードをnoneに設定します。ただし、これにより、サービスが利用できない場合にclient.Open()が例外をスローしなくなりました。また、ファクトリのcatchブロックでこのコードに依存しているため、問題が発生します。

メッセージセキュリティを使用するときにOpen()が例外をスローするが、セキュリティを無効にするときに例外をスローしない理由は何ですか?セキュリティがnoneに設定されている場合、どのようにして同様の可用性チェックを実行できますか?個々の呼び出しごとにエラー処理を伴うtrycatchを配置することは良い解決策ではないと思います。ファクトリメソッドがクライアントオブジェクトを返す前にサービスの可用性をチェックする別の方法はありますか?

4

1 に答える 1

1

例外はセキュリティでスローされませんが、セッションが関係している場合にのみスローされます。例:establishSecurityContext=trueまたはnegotiateServiceCredentials=true(デフォルト)。このような場合、サーバーへの最初の呼び出しの前に、クライアントは、使用する暗号化キーを決定するために、サーバーにいくつかのインフラメッセージを送信します。open()を呼び出すときは、このネゴシエーションを今すぐ行うように明示的に要求します(そうでない場合は、最初の呼び出しで発生します)。Wcfロギング(またはFiddler)をオンにすると、これが表示されます。

サービスが利用できない場合、ネゴシエーションは失敗するため、例外が発生します。

セキュリティがなければセッションはないので例外はありません。

IsAlive操作をサービスに追加することをお勧めします。

于 2012-04-18T17:49:55.777 に答える