Канал обратного вызова WCF неисправен - PullRequest
7 голосов
/ 12 октября 2009

Я пытаюсь реализовать логику переподключения для клиента 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, не может использоваться для связи, поскольку он находится в состоянии« Ошибка ».

Возможно ли, что канал обратного вызова все еще неисправен, и если да, как я могу заменить канал обратного вызова?

Ответы [ 2 ]

5 голосов
/ 30 октября 2009

До сих пор я сталкивался с необходимостью воссоздания соединения WCF по ошибке - в противном случае, похоже, нет способа восстановить его. Что касается того, когда происходит сбой, кажется, что метод срабатывает нормально, но часто он запускает и очищает соединение WCF (устанавливает новое и т. Д.) По мере выполнения текущего запроса, что приводит к сбою, особенно в случае тайм-аута.

Пара предложений: - Если это связано с тайм-аутом, отслеживайте последний раз, когда был сделан вызов, и постоянную, содержащую значение тайм-аута. Если соединение WCF было разорвано из-за неактивности, отбросьте его и создайте заново до , когда вы отправите запрос по проводной связи. - С другой стороны, похоже, что вы не добавляете обработчик ошибок повторно, это означает, что первая ошибка будет обработана, но во второй раз, когда она обнаружит ошибки, она перестанет работать без обработчика, поскольку новый не был присоединен.

Надеюсь, это поможет

0 голосов
/ 13 октября 2009

Вы пытались сбросить канал связи, вызвав mServiceClient.Abort в обработчике сбойных событий?

Edit:

Я вижу, что вы не реинициализируете объект mCallback в своем коде восстановления. Возможно, вам придется присвоить его новому экземпляру.

...