【问题标题】:check the availability of the WCF Web Service检查 WCF Web 服务的可用性
【发布时间】:2017-10-27 22:16:05
【问题描述】:

我想通过 C# 代码检查 WCF Web 服务 i.c 服务是否可用。如何实现?

【问题讨论】:

  • 有完整源代码的最终解决方案吗?

标签: wcf


【解决方案1】:

当您调用 Client.Open 时,如果它已关闭,则应该抛出一个您可以捕获的异常。
我更喜欢做的是实现一个返回名为 Ping 的布尔值的方法。该代码基本上只是执行return true;,因此它会尽快返回。在客户端,我调用它并捕获异常,如果我得到任何异常,那么我知道 Web 服务已关闭。
您可以扩展该模式以执行 PingCheckDB 或 PingCheckX 之类的操作,它们可以进行假/样本测试运行,因此您可以根据可用的内容启用/禁用客户端上的功能。

【讨论】:

  • @Alhmabra 该方法看起来像 public bool Ping() { return true; } 真的不是最有趣的方法。
  • 当我关闭网络时,Open() 不会抛出异常。
【解决方案2】:

详细说明上一个答案:确定服务是否“可用”的唯一方法是首先确定“可用”的含义。例如,依赖于数据库等外部资源的服务可能完全可用,但如果无法访问数据库,则该服务将可用但无用。

您还应该询问您将如何处理有关可用性的信息。特别是,如果您确定该服务是“可用的”,但当您调用它时,您会发现它并不是真正的“可用”。例如,如果上述服务可用并且数据库可用,但有一个特定的存储过程总是会失败。在这种情况下,服务是否“可用”?如果你指出它可用,但这个存储过程失败了,那会有多糟糕?

在许多情况下,最好直接调用 Web 服务,然后处理任何异常。如果您已经验证了要发送到服务的参数,那么从最终用户的角度来看,服务的任何故障都相当于服务不可用。

无法成功使用,你看。

【讨论】:

    【解决方案3】:

    这是我正在使用的,效果很好。如果您想在顶部使用 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();
    }
    

    【讨论】:

      【解决方案4】:

      我使用以下代码。这很简单,而且很有效......

          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

      【讨论】:

      • 是否需要超时时间才能确定服务是否可用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多