【问题标题】:Test if a website is alive from a C# application通过 C# 应用程序测试网站是否存在
【发布时间】:2010-09-16 06:12:47
【问题描述】:

我正在寻找通过 C# 应用程序测试网站是否存在的最佳方法。

背景

我的应用程序由一个Winforms UI、一个后端WCF 服务 和一个网站 组成,用于向UI 和其他消费者发布内容。为了防止 UI 启动并由于缺少 WCF 服务或网站关闭而无法正常工作的情况,我添加了一个应用启动检查以确保所有内容都处于活动状态。

应用程序是用 C#、.NET 3.5、Visual Studio 2008 编写的

当前解决方案

目前我正在向网站上的测试页面发出网络请求,该页面将反过来测试该网站,然后显示结果。

WebRequest request = WebRequest.Create("http://localhost/myContentSite/test.aspx");
WebResponse response = request.GetResponse();

我假设如果在此调用期间没有抛出异常,则一切正常,UI 可以启动。

问题

这是最简单、正确的方法,还是有其他一些我在 C# 中不知道的偷偷摸摸的调用或更好的方法。

【问题讨论】:

    标签: c# webrequest


    【解决方案1】:

    您需要检查 OK(状态 200)的状态代码。

    【讨论】:

      【解决方案2】:
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();
      if (response == null || response.StatusCode != HttpStatusCode.OK)
      

      正如@Yanga 提到的,HttpClient 可能是现在更常见的方法。

      HttpClient client = new HttpClient();
      var checkingResponse = await client.GetAsync(url);
      if (!checkingResponse.IsSuccessStatusCode)
      {
         return false;
      }
      

      【讨论】:

      • 这适用于任何网站吗?就像我正在做类似的事情,它在某些网站上给出错误,但是当我将 url 放入浏览器时,它打开正常。
      • @confusedMind 可能是服务器返回的代码不是 200 OK 状态代码。如果您查看HTTP Status codes 的列表,您会注意到所有 200,300 个 http 代码都不是错误代码,因此在浏览器中仍然可以正常加载页面。
      • HTTP 500s 会抛出异常,所以现有的检查是不够的。查看以下内容以捕获异常并检查 HTTP 状态代码:stackoverflow.com/questions/692342/… for
      • 我认为这个解决方案返回请求的 URL 正文!我们如何才能只检查一个 URL 是否存在?
      【解决方案3】:

      假设 WCF 服务和网站位于同一个 Web 应用程序中,您可以使用返回应用程序状态的“状态”WebService。您可能想要执行以下一些操作:

      • 测试数据库是否启动并运行(良好的连接字符串、服务启动等...)
      • 测试网站是否正常运行(具体取决于网站)
      • 测试 WCF 是否正常工作(具体取决于您的实现)
      • 额外的好处:如果您将来需要支持不同的版本,您可以返回服务的一些版本信息。

      然后,您在 Win.Forms 应用程序上为 WebService 创建一个客户端。如果 WS 没有响应(即您在调用时遇到一些异常),则网站已关闭(如“一般错误”)。
      如果 WS 响应,您可以解析结果并确保一切正常,或者如果出现问题,则返回更多信息。

      【讨论】:

      • 不幸的是,它们不在同一个网络应用程序中,但这不是什么大问题。我已经为 DB 和 ORM 创建了所有测试 :) (但感谢建议)
      • 关于它的真实世界样本? 测试数据库、网站、WCF、版本控制
      【解决方案4】:

      来自 CodePlex 上的 NDiagnostics 项目...

      public override bool WebSiteIsAvailable(string Url)
      {
        string Message = string.Empty;
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
      
        // Set the credentials to the current user account
        request.Credentials = System.Net.CredentialCache.DefaultCredentials;
        request.Method = "GET";
      
        try
        {
          using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
          {
            // Do nothing; we're only testing to see if we can get the response
          }
        }
        catch (WebException ex)
        {
          Message += ((Message.Length > 0) ? "\n" : "") + ex.Message;
        }
      
        return (Message.Length == 0);
      }
      

      【讨论】:

      【解决方案5】:

      在使用 WebResponse 时,请确保关闭响应流,即 (.close),否则它会在某些重复执行后挂起机器。 比如

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
      HttpWebResponse response = (HttpWebResponse)req.GetResponse();
      // your code here
      response.Close();
      

      【讨论】:

      • Maxymus 是对的 我遇到了一个问题,服务器在一段时间后没有响应我,但添加了 response.Close();修好了。
      • +1。关闭响应很容易被忽略(只是发生在我身上)。
      • 我同意但应该是:response.Close();注意情况。
      【解决方案6】:

      解决方案来自:How do you check if a website is online in C#?

      var ping = new System.Net.NetworkInformation.Ping();
      
      var result = ping.Send("https://www.stackoverflow.com");
      
      if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
          return;
      

      【讨论】:

      • 这只会 ping 服务器,即检查机器是否启动并运行。它不检查服务器是否响应端口 80 上的信息。
      【解决方案7】:

      我们今天可以使用HttpClient() 更新答案:

      HttpClient Client = new HttpClient();
      var result = await Client.GetAsync("https://stackoverflow.com");
      int StatusCode = (int)result.StatusCode;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多