如何知道WCF服务可用性?

时间:2012-06-04 16:42:50

标签: c# 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;
} 

我的服务是使用net tcp绑定。

我可以用它来进行net tcp绑定吗?

编辑:感谢JaredPar。假设我的第一个调用成功,而第二个调用则服务器关闭。因此,在进行服务调用之前,我检查处于OPEN状态的代理的状态,因此我进行最终超时的服务调用。我没有设置任何打开或关闭时间,因此默认情况下需要1分钟,并且调用会在我处置代理的服务的Fault事件处理程序中被捕获。但到那时UI挂起,我做了什么?

请指导。

2 个答案:

答案 0 :(得分:4)

这种类型的测试根本不可能。在尝试之前,无法可靠地检测给定的WCF或任何网络呼叫是否成功。有太多的变量超出了您的控制范围。

  • 物理网络
  • 运行WCF的计算机上的电源
  • 实际的WCF计划
  • 运行代码或WCF代码的计算机上的硬盘驱动器的稳定性

任何这些都可以在任何时间点终止/更改。因此,无法预测给定的呼叫是否会成功。

解决此问题的最佳方法是简单地使调用添加代码来处理失败的情况。

答案 1 :(得分: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();
}