如何在不使用 ping 的情况下检查 Web 服务是否已启动并运行

本文关键字:是否 服务 Web 启动 运行 检查 情况下 ping | 更新日期: 2023-09-27 18:31:25

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

如何在不使用 ping 的情况下检查 Web 服务是否已启动并运行

我使用此方法,它工作正常:

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

知道 Web 服务方法是否"正常"工作的唯一方法是调用该方法,然后评估结果是否"正常"。如果要记录"精细"与时间的关系,则可以记录评估结果。

没有更通用的方法可以做到这一点,没有任何意义。考虑:

  1. 你可以使用创建与服务终结点的 HTTP 连接的代码,但成功不会告诉你服务是否会在你向其发送任何消息后立即引发异常。
  2. 您可以连接并向其发送无效消息,但这并不能告诉您太多信息。
  3. 您可以连接并向其发送有效消息,然后检查结果以确保其有效。 这将为您提供一个很好的主意,即当真正的客户端立即调用服务时,真正的客户端应该期望一个有效的结果。
  4. 除非服务将此视为崩溃的机会,否则只是为了惹恼你!

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

到目前为止,Powershell是一种"ping"Web服务端点的简单方法。

使用以下表达式:

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

只需在 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 网络服务,而是使用看门狗服务或其他东西 ping 服务器。无需"ping"网络服务。我也认为你无论如何都不需要这样做。您的 Web 服务要么有效,要么由于代码错误而无法正常工作。

你可以试试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>

有很多选择;例子可以在'网络'中找到。

你可以给

自己写一个小工具或Windows服务或任何你需要的东西,然后看看这2篇文章:

C#:如何以编程方式检查 Web 服务是否已启动并正在运行?

检查 Web 服务是否已启动并运行 - 高效

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

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;
        }
    }

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

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

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

您也可以使用跟踪。

http://msdn.microsoft.com/en-us/library/ms732023.aspx

http://msdn.microsoft.com/en-us/library/ms733025.aspx