【发布时间】:2017-10-27 22:16:05
【问题描述】:
我想通过 C# 代码检查 WCF Web 服务 i.c 服务是否可用。如何实现?
【问题讨论】:
-
有完整源代码的最终解决方案吗?
标签: wcf
我想通过 C# 代码检查 WCF Web 服务 i.c 服务是否可用。如何实现?
【问题讨论】:
标签: wcf
当您调用 Client.Open 时,如果它已关闭,则应该抛出一个您可以捕获的异常。
我更喜欢做的是实现一个返回名为 Ping 的布尔值的方法。该代码基本上只是执行return true;,因此它会尽快返回。在客户端,我调用它并捕获异常,如果我得到任何异常,那么我知道 Web 服务已关闭。
您可以扩展该模式以执行 PingCheckDB 或 PingCheckX 之类的操作,它们可以进行假/样本测试运行,因此您可以根据可用的内容启用/禁用客户端上的功能。
【讨论】:
详细说明上一个答案:确定服务是否“可用”的唯一方法是首先确定“可用”的含义。例如,依赖于数据库等外部资源的服务可能完全可用,但如果无法访问数据库,则该服务将可用但无用。
您还应该询问您将如何处理有关可用性的信息。特别是,如果您确定该服务是“可用的”,但当您调用它时,您会发现它并不是真正的“可用”。例如,如果上述服务可用并且数据库可用,但有一个特定的存储过程总是会失败。在这种情况下,服务是否“可用”?如果你指出它可用,但这个存储过程失败了,那会有多糟糕?
在许多情况下,最好直接调用 Web 服务,然后处理任何异常。如果您已经验证了要发送到服务的参数,那么从最终用户的角度来看,服务的任何故障都相当于服务不可用。
无法成功使用,你看。
【讨论】:
这是我正在使用的,效果很好。如果您想在顶部使用 Using 语句来限定它,ServiceController 位于命名空间“System.ServiceProcess”中。
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();
}
【讨论】:
我使用以下代码。这很简单,而且很有效......
public bool IsServiceRunning()
{
try
{
System.Net.WebClient wc = new System.Net.WebClient();
string s = wc.DownloadString(new Uri("http://localhost:27777/whatever/services/GatherDataService?wsdl"));
}
catch (Exception ex)
{
return false;
}
return true;
}
只需获取您的端点 uri 并添加 ?wsdl
【讨论】: