7

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は、障害状態にあるため、通信に使用できません」という例外が発生します。

コールバックチャネルにまだ障害が発生している可能性はありますか?はいの場合、コールバックチャネルを置き換えるにはどうすればよいですか?

4

2 に答える 2

5

これまでのところ、障害時にWCF接続を再作成する必要があることを経験しました。それ以外の方法でWCF接続を回復する方法はないようです。障害が発生した場合、メソッドは正常に起動するように見えますが、多くの場合、現在の要求が実行されているときにWCF接続を起動してクリーンアップし(新しい接続を確立するなど)、これを失敗させます。特にタイムアウトの場合に当てはまります。

いくつかの提案:-タイムアウトに関連している場合は、最後に呼び出しが行われた時刻と、タイムアウト値を含む定数を追跡します。非アクティブなためにWCF接続が切断された場合は、要求をネットワーク経由で送信する前に、接続を切断して再作成してください。-もう1つは、フォールトハンドラーを再度追加していないようです。つまり、最初のフォールトが処理されますが、2回目のフォールトでは、ハンドラーなしでフォールオーバーし、新しいフォールトがアタッチされていません。

お役に立てれば

于 2009-10-30T10:42:19.033 に答える
0

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

編集:

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

于 2009-10-13T09:05:53.647 に答える