【问题标题】:How to check if a web service is up and running without using ping?如何在不使用 ping 的情况下检查 Web 服务是否已启动并运行?
【发布时间】:2012-04-18 09:51:57
【问题描述】:

如何检查 Web 服务中的方法是否正常工作?我无法使用 ping。我仍然想检查客户端从 Web 服务调用的任何类型的方法。我知道很难一概而论,但应该有一些方法。

【问题讨论】:

  • 它实际上很奇怪 - 你想检查服务状态,但不想 ping 它.. 意味着不想调用它。
  • @alexanderb 嗯... ping 在这里不起作用,所以我需要一个替代方法 :) 以及任何其他调用和检查此 Web 服务方法的方法将不胜感激。
  • @bebojoor 这里有一个与此主题类似的问题:stackoverflow.com/questions/10088950/… 我建议您定期调用一个无害的服务方法来验证 Web 服务是否“启动”

标签: c# wcf web-services methods ping


【解决方案1】:

我用这个方法,效果很好:

public bool IsAddressAvailable(string address)
{
    try
    {
        System.Net.WebClient client = new WebClient();
        client.DownloadData(address);
        return true;
    }
    catch
    {
        return false;
    }
}

【讨论】:

    【解决方案2】:

    了解 Web 服务方法是否“正常”工作的唯一方法是调用该方法,然后评估结果是否“正常”。如果您想记录“罚款”与时间的关系,那么您可以记录评估结果。

    没有更通用的方法可以做到这一点。考虑:

    1. 您的代码可以创建到服务端点的 HTTP 连接,但成功并不能告诉您服务是否会在您向其发送任何消息后立即抛出异常。
    2. 您可以连接并发送无效消息,但这并不能说明什么。
    3. 您可以连接并发送一条有效消息,然后检查结果以确保它有效。这会给你一个很好的想法,即当真正的客户随后立即调用服务时,真正的客户应该期待一个有效的结果。
    4. 除非服务将此作为崩溃的机会,否则就是为了惹恼你!

    最好的技术是使用 WCF 跟踪(可能使用消息级跟踪)来记录服务实际发生的情况,无论好坏。然后,人类可以查看日志以查看它们是否“正常”。

    【讨论】:

      【解决方案3】:

      到目前为止,Powershell 是一种“ping”网络服务端点的简单方法。

      使用以下表达式:

      Test-NetConnection -Port 4408 -ComputerName 192.168.134.1
      

      这是对不存在或未侦听的端口的故障响应;

      WARNING: TCP connect to 192.168.134.1:4408 failed
      ComputerName           : 192.168.134.1
      RemoteAddress          : 192.168.134.1
      RemotePort             : 4408
      InterfaceAlias         : Ethernet0
      SourceAddress          : 192.168.134.1
      PingSucceeded          : True
      PingReplyDetails (RTT) : 0 ms
      TcpTestSucceeded       : False
      

      如果地址/端口正在侦听且可访问,则以下是成功结果:

      ComputerName     : 192.168.134.1
      RemoteAddress    : 192.168.134.1
      RemotePort       : 4407
      InterfaceAlias   : Ethernet0
      SourceAddress    : 192.168.134.1
      TcpTestSucceeded : True
      

      【讨论】:

        【解决方案4】:

        只需在 Web 服务的方法中使用 try catch 并将异常记录到日志文件或事件日志中。 示例:

        [OperationContract]
         public bool isGUID(string input)
        {
            bool functionReturnValue = false;
        
            try
            {
                Guid guid;
                functionReturnValue = Guid.TryParse(input, guid);
            }
            catch (Exception ex)
            {
                Log.WriteServerErrorLog(ex);
            }
        
            return functionReturnValue;
        }
        

        您不需要 ping web 服务,而是使用看门狗服务或其他东西 ping 服务器。无需“ping”网络服务。我也认为你不需要这样做。 您的网络服务可以正常工作,或者由于代码错误而无法正常工作。

        【讨论】:

        • 虽然日志记录通常是个好主意,但仅记录异常并没有帮助:我仍然想检查客户端从 Web 服务调用的任何类型的方法。希望他不会在他的网络服务的每个方法中都抛出异常;)
        • 如果他可以写一个异常日志,他也可以在try括号中写一个日志来统计数据,我认为那里没有问题。
        【解决方案5】:

        你可以试试curl。它是一个 Linux 工具,Cygwin 中应该也有。

        $ curl http://google.com
        <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
        <TITLE>301 Moved</TITLE></HEAD><BODY>
        <H1>301 Moved</H1>
        The document has moved
        <A HREF="http://www.google.com/">here</A>.
        </BODY></HTML>
        

        有很多选择;示例可以在“网络”中找到。

        【讨论】:

        • 嗯?您的代码是否在检查任何 Web 服务方法?我不想使用 cURL ......我正在使用 windows 平台:)
        【解决方案6】:

        您可以为自己编写一个小工具或 Windows 服务或任何您需要的东西,然后查看以下 2 篇文章:

        C#: How to programmatically check a web service is up and running?

        check to if web-service is up and running - efficiently

        编辑: 这是我在类似场景中的实现,在每次调用之前我都需要知道外部服务是否仍然存在:

        bool IsExternalServiceRunning
            {
                get
                {
                    bool isRunning = false;
                    try
                    {
                        var endpoint = new ServiceClient();
                        var serviceUri  = endpoint.Endpoint.Address.Uri;
                        var request = (HttpWebRequest)WebRequest.Create(serviceUri);
                        request.Timeout = 1000000;
                        var response = (HttpWebResponse)request.GetResponse();
                        if (response.StatusCode == HttpStatusCode.OK)
                            isRunning = true;
                    }
                    #region
                    catch (Exception ex)
                    {
                        // Handle error
                    }
                    #endregion
                    return isRunning;
                }
            }
        

        【讨论】:

          【解决方案7】:

          在我看来,您有两个选择:

          • 如果您可以访问正在运行它的服务器,请记录每个调用(以及引发的异常)。
            使用baretail 之类的软件读取日志文件,该软件会随着文件的写入而更新。

          • 如果您无法访问服务器,则必须让 Web 服务将该日志远程写入您有权访问的另一台计算机。
            流行的记录器内置了这个功能。(Log4Net, ...)

          【讨论】:

            【解决方案8】:
            猜你喜欢
            • 1970-01-01
            • 2014-01-18
            • 2012-08-19
            • 1970-01-01
            • 1970-01-01
            • 2011-07-10
            • 1970-01-01
            • 2022-01-25
            • 2017-05-29
            相关资源
            最近更新 更多