3

WCF プロキシ クラスの準備が整うのを待ってから続行するか、サービスの呼び出しを許可する方法を見つけようとしています。

私はこのようなことを試しました:

    _proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));

    while(!_proxy.State.Equals(CommunicationState.Opened)) {
        if(!_proxy.State.Equals(CommunicationState.Opening)) {
            try {
                _proxy.Open();
            } catch(EndpointNotFoundException enfe) {
                /* ... */
            }
        }
        System.Threading.Thread.Sleep(1);
    }

しかし、明らかにそれは機能しません。そうでなければ、私はここにいません。最初はうまくいくように見えますが、ChannelFactory は open ステートメントで InvalidOperationException をスローします。

私はWCFが初めてで、おそらくソケット風の何かに沿って考えすぎているのかもしれませんが、エンドポイントが利用可能になるか見つかるまでクライアントに再試行を続けてもらいたいと思います.接続されたイベントまたはそれらの線に沿った何か。

4

1 に答える 1

4

EndpointNotFoundException を使用すると、「... をリッスンしているエンドポイントがありませんでした」のようなメッセージが表示される可能性があります。while ループ中に、最初のパスでプロキシを開き、エラーを処理し、2 番目のパスで、「通信オブジェクト System.ServiceModel.Channels.ServiceChannel はできない」という InvalidOperationException を取得します。開いた状態で変更できません。」

既存のプロキシで接続を中止すると、それ以降の通信に使用できなくなります。接続を閉じると、プロキシ オブジェクトは破棄されます。解決策は、既存のプロキシを閉じて、新しいプロキシを作成することです。以下のコードを更新しました。

_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));

while(!_proxy.State.Equals(CommunicationState.Opened)) {
    if(!_proxy.State.Equals(CommunicationState.Opening)) {
        try {
            _proxy.Open();
        } catch(EndpointNotFoundException enfe) {
            /* ... */
            _proxy.Abort();
            _proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));
        }
    }
    System.Threading.Thread.Sleep(1);
}
于 2012-07-12T17:50:59.227 に答える