7


4

私はWCFクライアント用の再接続ロジックを実装しようとしています。 現在のチャンネルがフォルト状態になった後に新しいチャンネルを作成する必要があることを私は知っています。 これはチャネルエラーイベントハンドラで行いました。

内部クラスServiceClient:DuplexClientBase、IServiceClient {public ServiceClient(ICallbackコールバック、EndpointAddress serviceAddress):base(コールバック、MyUtility.GetServiceBinding( "NetTcpBinding")、serviceAddress){//接続を開く 開いた(); }

public void Register(string clientName){//サービスに登録}

public void DoSomething(){//いくつかのコード}}

パブリッククラスClientApp {プライベートIServiceClient mServiceClient;

private ICallback mCallback;

public ClientApp(){mServiceClient =新しいServiceClient(mCallback、新しいEndpointAddress( "someAddress"));

mServiceClient.Register();

//サービスクライアントの失敗イベントを登録する((ICommunicationObject)mServiceClient).Faulted = new EventHandler(ServiceClient_Faulted); }

void ServiceClient_Faulted(object sender、EventArgs e){//新しいサービスクライアントを作成する。 mServiceClient = new ServiceClient(mCallback、new EndpointAddress( "someAddress"));

// Cell ControllerでEIを登録します。mServiceClient.Register(); }

public void DoSomething(){mServiceClient.DoSomething();} }}

しかし、私の単体テストではまだ「通信オブジェクトSystem.ServiceModel.Channels.ServiceChannelはFaulted状態にあるため通信に使用できません」という例外が発生します。

コールバックチャネルがまだ故障している可能性はありますか?もしそうなら、どのように私はコールバックチャネルを取り替えることができますか?

2 回答


5


これまでのところ、WCF接続は障害が発生したときに再作成する必要があることを経験しました。そうでなければそれを回復する方法はないようです。 障害が発生した場合、このメソッドは正常に起動するように見えますが、現在の要求が通過するとWCF接続が起動してクリーンアップされ(新しい接続の確立など)、失敗する原因となります。

いくつかの提案: - それがタイムアウトに関連しているなら、最後の呼び出しが行われた時間とタイムアウト値を含む定数を追跡してください。 WCF接続が非アクティブ状態のためにドロップされている場合は、それをドロップして、回線を介して要求を送信する前に*再作成します。 - もう1つは、フォルトハンドラを再追加していないように見えることです。つまり、最初のフォルトが処理されますが、2番目のフォルトはハンドラなしで失敗し、新しいフォルトハンドラは追加されません。

お役に立てれば


0


FaultedイベントハンドラでmServiceClient.Abortを呼び出して通信チャネルをリセットしようとしましたか?

編集する

リカバリコードでmCallbackオブジェクトを再初期化しないようにします。 あなたはそれを新しいインスタンスに割り当てる必要があるかもしれません。