У меня есть приложение в реальном времени, которое отслеживает активы на нескольких сайтах по всей стране. В рамках этого решения у меня есть 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, имея общее решение, лучше, чем иметь дело с тайм-аутами на уровне отдельного исключения, НО ... Я думал, что приведенное ниже решит мою проблему (но добавит TON дополнительной обработки ошибок кода):
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;
}