2

WCFチャネルに障害が発生した状態のときに、操作を再試行するための洗練された方法を見つけようとしています。Policy Injection ABを使用して、最初の呼び出しで障害状態の例外が発生したときに再接続して操作を再試行しようとしましたが、PolicyInjection.WrapメソッドはTransparentProxyオブジェクト(ChannelFactory.CreateChannelから返されたプロキシ)をラップするのが好きではないようです。

他に試すことができるメカニズムはありますか、またはPIABソリューションを正しく機能させるにはどうすればよいですか?リンク、例などをいただければ幸いです。

これが私が使っていた失敗したコードです:
var channelFactory = new ChannelFactory(endpointConfigurationName);
var proxy = channelFactory.CreateChannel(...);
proxy = PolicyInjection.Wrap<IService>(proxy);

ありがとうございました。

4

2 に答える 2

3

むしろ、次のようなコールバック関数を使用したいと思います。

    private SomeServiceClient proxy;

    //This method invokes a service method and recreates the proxy if it's in a faulted state
    private void TryInvoke(Action<SomeServiceClient> action)
    {
        try
        {
            action(this.proxy);
        }
        catch (FaultException fe)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                this.proxy.Abort();
                this.proxy = new SomeServiceClient();
                //Probably, there is a better way than recursion
                TryInvoke(action);
            }
        }
    }

    //Any real method
    private void Connect(Action<UserModel> callback)
    {
        TryInvoke(sc => callback(sc.Connect()));
    }

そしてあなたのコードであなたは呼ぶべきです

ServiceProxy.Instance.Connect(user => MessageBox.Show(user.Name));

それ以外の

var user = ServiceProxy.Instance.Connect();
MessageBox.Show(user.Name);

私のコードはプロキシクラスのアプローチを使用していますが、Channelsを使用して同様のコードを記述できます。

于 2010-11-23T10:04:01.020 に答える
0

お返事ありがとうございます。最終的に行ったのは、サービスのインターフェイスを実装するデコレータ型クラスを作成し、ChannelFactoryによって生成された透過プロキシをラップすることでした。次に、ポリシーインジェクションアプリケーションブロックを使用して、この上にレイヤーを作成し、操作を試行する各操作呼び出しにコードを挿入し、CommunicationObjectFaultedExceptionが発生した場合、チャネルを中止して再作成し、操作を再試行することができました。 。今はうまく機能しています-うまく機能していますが、唯一の欠点は、すべてのサービス操作を実装する必要があると述べたラッパークラスですが、これが私にとって理にかなっているので、PIABを使用できる唯一の方法でした将来的には、インターフェイスを使用するだけで簡単に変更できます。

于 2010-12-11T04:26:47.383 に答える