Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Редактировать:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top