【问题标题】:C#: How to programmatically check a web service is up and running?C#:如何以编程方式检查 Web 服务是否已启动并正在运行?
【发布时间】:2012-08-19 02:38:50
【问题描述】:

我需要创建一个 C# 应用程序来监控一组 Web 服务是否启动并运行。用户将从下拉列表中选择服务名称。程序需要用对应的服务 URL 进行测试,并显示服务是否在运行。最好的方法是什么?我正在考虑的一种方法是测试我们是否能够下载 wsdl。有没有更好的办法?

注意:此应用程序的目的是用户只需要知道服务名称。他不需要记住/存储服务的相应 URL。

我需要此 C# 应用程序的网站版本和桌面应用程序版本。

注意:现有服务正在使用 WCF。但将来可能会添加非 WCF 服务。

注意:我的程序不会知道(或不感兴趣)服务中的操作。所以我不能调用服务操作。

参考

  1. How to check if a web service is up and running without using ping?
  2. C program-How do I check if a web service is running

【问题讨论】:

  • 这些将被监控的服务是预先配置好的,对吧?我的意思是,这是一个通用的 Web 服务监控工具吗?
  • 下载 WSDL 将验证 site 是否正在运行,但不会告诉您 Web 服务的依赖项(数据库、引用等)是否已关闭或丢失.
  • 我通常会向我的服务添加一个Version 方法,该方法只从该服务返回一个“版本字符串”——如果它已启动并正在运行。但实际上:这并不能告诉你任何事情......你的调用现在 - 但不能保证一纳秒后它仍然可以工作......你只需要编程防御性并随时准备服务调用可能会失败或超时或其他任何事情......
  • “启动并运行”的定义是什么?一个 HTTP 200 状态代码很好地意味着后端数据库仍然崩溃。
  • 我相信您可以禁用 WSDL 的下载,所以这可能不是最好的方法。如果我错了,请有人纠正我。

标签: c# asp.net .net wcf web-services


【解决方案1】:

这不能保证功能,但至少您可以检查与 URL 的连接:

var url = "http://url.to.che.ck/serviceEndpoint.svc";

try
{
    var myRequest = (HttpWebRequest)WebRequest.Create(url);

    var response = (HttpWebResponse)myRequest.GetResponse();

    if (response.StatusCode == HttpStatusCode.OK)
    {
        //  it's at least in some way responsive
        //  but may be internally broken
        //  as you could find out if you called one of the methods for real
        Debug.Write(string.Format("{0} Available", url));
    }
    else
    {
        //  well, at least it returned...
        Debug.Write(string.Format("{0} Returned, but with status: {1}", 
            url, response.StatusDescription));
    }
}
catch (Exception ex)
{
    //  not available at all, for some reason
    Debug.Write(string.Format("{0} unavailable: {1}", url, ex.Message));
}

【讨论】:

  • 还有其他方法可以检查进程是否启动并运行?我正在尝试您的建议 GetResponse() 方法,但它需要更多时间..
  • 这是我获取服务 uri 的方式:var url = ServiceClient().Endpoint.Address.Uri;
【解决方案2】:

我可能回答得太晚了,但这种方法对我有用。 我使用 Socket 来检查进程是否可以连接。 如果您尝试检查连接 1-3 次,则 HttpWebRequest 有效,但如果您有一个将运行 24 小时的进程并且不时需要检查将不再工作的网络服务器可用性,因为会抛出 TimeOut 异常。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var result = socket.BeginConnect("xxx.com", 80, null, null);
                bool success = result.AsyncWaitHandle.WaitOne(3000,false); // test the connection for 3 seconds
                var resturnVal = socket.Connected;
                if (socket.Connected)
                    socket.Disconnect(true);
                socket.Dispose();
                return resturnVal;

【讨论】:

  • 我将此答案用于我的解决方案,效果很好且简洁。然而,由于 Socket 是一次性的,我将整个代码块包装在一个 using 块中。即:using(Socket socket = new Socket(...)){ ... }
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2020-07-28
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多