2010-11-23 12 views
2

WCFチャネルがフォールト状態のときに操作を再試行するエレガントな方法を見つけようとしています。最初の呼び出しでフォールト状態の例外が発生したときにPolicy Injection ABを使用して操作を再接続して再試行しましたが、PolicyInjection.WrapメソッドはTransparentProxyオブジェクト(ChannelFactory.CreateChannelから返されたプロキシ)をラッピングするようには見えません。WCFチャネルがフォールト状態のときの再試行メカニズム

私は試してみることができる他のメカニズムがありますか、どのようにPIABソリューションが正しく動作するように試みることができますか - リンクや例などは大いに感謝します。ここで

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

ありがとうございました。私のコードは、プロキシを使用していますが

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())); 
    } 

そして、あなたのコード内の

あなたの代わりに

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

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

を呼び出す必要があります:

答えて

0

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

3

私はむしろ、コールバック関数、このようなものを使用します-classアプローチでは、Channelsで同様のコードを書くことができます。

+0

あなたの答えをありがとう - それは非常に感謝しています。このソリューションの私の懸念は、100から200番のサービスコールでは、サービスコールの各呼び出しがServiceProxy.Instance.TryInvokeにラップされていることを確認し、サービスインジェクションAppBlock(または他のAOPタイプのフレームワーク)を使用する以外の方法はありません - 私は何かが欠けていない限り。 – CraigM

関連する問題