53

我正在寻找通过 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# 中不知道的偷偷摸摸的调用或更好的方法。

4

7 回答 7

93
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;
}
于 2008-10-09T11:58:44.363 回答
21

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

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// your code here
response.Close();
于 2010-10-15T05:22:55.867 回答
9

来自 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);
}
于 2008-10-09T12:03:17.973 回答
6

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

HttpClient Client = new HttpClient();
var result = await Client.GetAsync("https://stackoverflow.com");
int StatusCode = (int)result.StatusCode;
于 2018-02-14T16:30:29.717 回答
3

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

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

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

于 2008-10-09T12:00:42.473 回答
-3

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

于 2008-10-09T11:55:40.017 回答
-3

来自的解决方案:如何在 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;
于 2014-11-11T08:46:14.967 回答