2

在进行服务调用之前,我想知道 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 绑定。

我可以将它用于网络 tcp 绑定吗?

编辑:谢谢贾里德帕。假设我的第一次通话成功,而第二次通话时服务器已关闭。因此,在进行服务调用之前,我检查了处于 OPEN 状态的代理的状态,因此我进行了最终超时的服务调用。我没有设置任何打开或关闭超时,因此默认情况下需要 1 分钟,并且调用在我处理代理的服务的故障事件处理程序中被捕获。但是到那时 UI 挂起,我该怎么办?

请指导。

4

2 回答 2

4

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

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

其中任何一个都可以在任何时间点终止/更改。因此,无法预测给定的调用是否会成功。

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

于 2012-06-04T16:46:29.740 回答
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();
}
于 2014-03-11T22:14:55.373 回答