Что за одержимость проверкой наличия этих сервисов ??
Просто позвоните в службу, и, как вас научит любой курс защитного программирования, будьте готовы обрабатывать исключения.
Нет никакой пользы в том, чтобы постоянно посылать «ты здесь?» запросы по всей сети ...
Даже если бы у вас могло быть что-то вроде метода Ping ()
(который просто возвращает фиксированное значение или что-то в этом роде - имя вашей службы или что-то еще) - он только проверяет, действительно ли ваш сервис доступен - как насчет базы данных, из которой вам нужно запросить данные? А как насчет других услуг, от которых зависит ваш метод обслуживания? Становится довольно запутанным, и очень-очень сложно найти способ все это проверить - просто чтобы посмотреть, есть ли оно.
Вкратце: нет, не существует надежного и значимого способа проверить, существует ли данная услуга «там» и «жива» - просто позвоните ей! И будьте готовы справиться с ошибкой - она временами дает сбой ....
Нет смысла проверять, работает служба или нет. Абсолютно никакой. Почему?
if(serviceIsAlive())
{
callService();
}
else
{
handleFailure()
}
Вы видите проблему с этим фрагментом? Что произойдет, если между моментом, когда вы проверяете, работает ли служба, и временем, когда вы ее вызываете, служба отключается? Это состояние гонки и ошибка, ожидающая своего появления. Итак, что вам нужно сделать, даже если вы можете проверить условие обслуживания, это:
if(serviceIsAlive())
{
try
{
callService();
}
catch(CommunicationException)
{
handleFailure();
}
}
else
{
handleFailure();
}
Но в этом блоке вызов handleFailure () находится в двух разных местах - у нас есть два разных пути для обработки одного и того же состояния ошибки. - что кажется плохим. Таким образом, это можно безопасно сократить до:
try
{
callService();
}
catch(CommunicationException)
{
handleFailure();
}
Если ваш сервис размещен в IIS (или WAS), вы можете выполнить resiliency, встроенную в модель процессов IIS6/7. Если рабочий процесс выйдет из строя, вместо него будет запущен другой. Как это работает? Используем Ping для анализа. Это называется AppoPool Health Monitoring (описано здесь).