Лучший способ справиться с тайм-аутом WCF

У меня есть приложение в реальном времени, которое отслеживает ресурсы на нескольких сайтах по всей стране. В рамках этого решения у меня есть 8 клиентских приложений, которые обновляют центральный сервер.

У меня вопрос в том, что иногда приложения теряют связь с центральным сервером, и мне интересно, как лучше с этим справиться? Я знаю, что могу просто увеличить максимальное время отправки / получения, чтобы справиться с таймаутом, НО мне также нужно изящное решение, чтобы справиться, если соединение с сервером не работает:

Например, я вызываю свои службы следующим образом:

using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
    statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}

Я подумывал добавить try / catch, поэтому ...

using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
    try
    {
       statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
    }
    catch (TimeoutException timeout)
    {
       LogMessage(timeout);
    }
    catch (CommunicationException comm)
    {
       LogMessage(comm);
    }
}

Такой подход не позволяет мне повторно запустить код, не повторяя тонну кода. У кого-нибудь есть предложения?

РЕДАКТИРОВАТЬ: изучение ответов Sixto Saez и user24601 с общим решением лучше, чем с тайм-аутом на уровне отдельного исключения, НО ... Я думал, что приведенное ниже решение решит мою проблему (но добавит ТОННУ) дополнительной обработки ошибок кода):

void Method(int statusId)
{
     var statusRepository = new StatusRepositoryClient.StatusRepositoryClient()

      try
      {
         IsServerUp();
         statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
         statusRepository.Close(); 
      }            
      catch (Exception ex)
      {
            statusRepository.Abort();

            if (ex is TimeoutException || ex is CommunicationException)
            {
              LogMessage(timeout);
              Method(statusId);
            }
            else
            {
                throw new Exception(ex.Message + ex.InnerException);
            }
        }

  }
}

bool IsServerUp()
{
    var x = new Ping();
    var reply = x.Send(IPAddress.Parse("127.0.0.1"));

    if (reply == null)
    {
       IsServerUp();
    }
    else
    {
       if (reply.Status != IPStatus.Success)
       {
          IsServerUp();
       }
    }

    return true;
}
8
задан Jon Jones 29 June 2011 в 15:16
поделиться