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