从C#应用程序测试网站是否存活

Fry*_*ard 45 c# webrequest

我正在寻找测试一个网站是否在C#应用程序中存活的最佳方法.

背景

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

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

现行解决方案

目前,我正在向网站上的测试页面发出Web请求,该测试页面将对网站进行测试,然后显示结果.

WebRequest request = WebRequest.Create("http://localhost/myContentSite/test.aspx");
WebResponse response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

我假设如果在此调用期间没有异常,那么一切都很好,UI可以启动.

这是最简单,正确的方式,还是在C#中我还不知道其他一些偷偷摸摸的电话或更好的方法.

Ech*_*orm 83

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response == null || response.StatusCode != HttpStatusCode.OK)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于任何网站吗?就像我正在制作类似的东西,它在某些网站上给出了错误但是当我把网址放在浏览器中它打开很好. (2认同)
  • @confusedMind可能是服务器返回的代码不是200 OK状态代码.如果查看[HTTP状态代码]列表(http://en.wikipedia.org/wiki/List_of_HTTP_status_codes),您会注意到所有200,300个http代码都不是错误代码,因此在浏览器中可能仍会加载页面好像很好. (2认同)
  • HTTP 500s将抛出异常,因此现有检查是不够的.请查看以下内容以捕获异常,并检查HTTP状态代码:http://stackoverflow.com/questions/692342/net-httpwebrequest-getresponse-raises-exception-when-http-status-code-400- ba for (2认同)

Max*_*mus 20

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

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// your code here
response.Close();
Run Code Online (Sandbox Code Playgroud)

  • Maxymus是对的我有一个问题,服务器在一段时间后没有响应我,但添加了response.Close(); 固定它. (2认同)
  • 我同意但应该是:response.Close(); 注意这个案子. (2认同)

Zom*_*eep 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 HEAD 动词可以更快。 (2认同)

Yan*_*nga 6

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

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