2009-10-12 11 views
7

私はwcfクライアントの再接続ロジックを実装しようとしています。私は、現在のチャンネルがフォールト状態に入った後に新しいチャンネルを作成しなければならないことを知っています。私は、チャネル障害が発生し、イベントハンドラでこれをやった:WCFコールバックチャネルがエラー


internal class ServiceClient : DuplexClientBase, IServiceClient 
{ 
    public ServiceClient(ICallback callback, EndpointAddress serviceAddress) 
    : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress) 
    { 
    // Open the connection. 
    Open(); 
    } 

    public void Register(string clientName) 
    { 
    // register to service 
    } 

    public void DoSomething() 
    { 
    // some code 
    } 
} 

public class ClientApp 
{ 
    private IServiceClient mServiceClient; 

    private ICallback mCallback; 

    public ClientApp() 
    { 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    mServiceClient.Register(); 

    // register faulted event for the service client 
    ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted); 
    } 

    void ServiceClient_Faulted(object sender, EventArgs e) 
    { 
    // Create new Service Client. 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    // Register the EI at Cell Controller 
    mServiceClient.Register(); 
    } 

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

しかし、私のユニットテストで私はまだ「通信オブジェクト、System.ServiceModel.Channels.ServiceChannelを取得し、それが故障しているため、通信に使用することはできません状態 "例外です。

コールバックチャネルにもフォルトが発生する可能性はありますか?はいの場合、コールバックチャネルをどのように置き換えることができますか?

+0

ユニットテストが例外をトリガするときに行うことを指定できますか? –

+0

私のユニットテストでは、私はサービスホストとクライアントインスタンスを作成します。サービスにクライアントを登録し、参照をnullに設定してサービスを停止します。その後、私は20秒待っている(私はInactivityTimeoutof 10秒で信頼できるセッションを使用しているので、接続が20秒後に失われていると確信している)、クライアント上でDoSomething()メソッドを呼び出します。今度はサービスを再作成し、クライアントが再接続することを期待します。その瞬間、私は例外を得る。 – phatoni

答えて

5

これまでのところ、私はWCF接続を間違えて再作成する必要があることを経験しました。それ以外の方法で復旧する方法はないようです。フォールトが発生した場合、メソッドは正常に動作しているように見えますが、現在の要求が進行しているときにWCF接続を確立して(新しいものを確立するなど)、これが失敗する原因になります。

提案のいくつか: - タイムアウトに関連している場合は、コールが最後に行われた時刻とタイムアウト値を含む定数を記録しておきます。 WCF接続が非アクティブなためにドロップされた場合は、を再作成しての前に送信してください。 - もう1つは、フォルトハンドラを追加していないように見えます。つまり、最初のフォルトが処理されますが、2回目はフォルトが発生します。

希望します。

0

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

編集:私はあなたのリカバリコードにmCallbackオブジェクトを再初期化していないことを確認

。新しいインスタンスに割り当てる必要があるかもしれません。

+0

ご協力ありがとうございます。はい、これまでに試しましたが、「通信オブジェクト、System.ServiceModel.Channels.ServiceChannelは、Aborted状態になっているため通信に使用できません」という例外がありますので、あまり役に立ちませんでした。例外。 – phatoni

関連する問題