2012-06-04 3 views
2

Я хочу знать, доступна ли служба WCF или нет, прежде чем совершать служебный вызов. Что может быть лучшим способом?Как узнать доступность службы WCF?

Как об использовании этого:

bool isServiceUp = true; 
try 
{ 
    string address = "http://localhost/MyService.svc?wsdl"; 

MetadataExchangeClient mexClient = new MetadataExchangeClient(new Uri(address), MetadataExchangeClientMode.HttpGet); 
    MetadataSet metadata = mexClient.GetMetadata(); 
// if service down I get the exception 
} 
    catch (Exception ex) 
{ 
    isServiceUp = false; 
} 

Моя служба использует чистый TCP связывания.

Могу ли я использовать его для привязки сетевого tcp?

EDIT: Thanks JaredPar. Предположим, что мой первый вызов преуспел, а второй - сервер. Поэтому перед выполнением вызова службы я проверяю состояние прокси-сервера, которое находится в состоянии ОТКРЫТО, и, следовательно, я делаю вызов службы, который в конечном итоге получает тайм-аут. Я не установил никаких открытых или закрытых тайм-аутов, поэтому по умолчанию требуется 1 минута, и вызов попадает в обработчик события Fault службы, в которой я удаляю прокси. Но к тому времени пользовательский интерфейс зависает, что я делаю?

Просим руководствоваться.

ответ

4

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

  • Физическая сеть
  • Источник питания на машине, где WCF работает
  • Фактическая программа WCF
  • Устойчивость жесткого диска на компьютере, где ваш код или код WCF работает

Любое из них может быть прекращено/изменено в любой момент времени. Следовательно, невозможно предсказать, будет ли данный вызов успешным.

Лучший способ подойти к этой проблеме - просто сделать вызов, чтобы добавить код для обработки случаев, когда он сработает.

+0

Thanks Jaredpar, я обновил вопрос. –

0

Попробуйте этот код ниже, это работает для меня. И класс ServiceController живет в пространстве имен System.ServiceProces.

try 
{ 
    ServiceController sc = new ServiceController("Service Name", "Computer's IP Address"); 
    Console.WriteLine("The service status is currently set to {0}", 
     sc.Status.ToString()); 

    if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
     (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
    { 
     Console.WriteLine("Service is Stopped, Ending the application..."); 
     Console.Read(); 
     EndApplication(); 
    } 
    else 
    { 
     Console.WriteLine("Service is Started..."); 
    } 
} 
catch (Exception) 
{ 
    Console.WriteLine("Error Occurred trying to access the Server service..."); 
    Console.Read(); 
    EndApplication(); 
} 
Смежные вопросы