我想在进行服务调用之前知道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挂起,我做了什么?
请指导。
答案 0 :(得分:4)
这种类型的测试根本不可能。在尝试之前,无法可靠地检测给定的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();
}