从一个C#应用程序testing一个网站是否还活着

我正在寻找最好的方法来testing一个网站是否从C#应用程序是活着的。

背景

我的应用程序包含一个WinForms UI ,一个后端WCF服务和一个向UI和其他用户发布内容的网站 。 为了防止由于缺lessWCF服务或网站closures而导致UI启动失败并且无法正常工作的情况,我添加了应用程序启动检查,以确保所有内容都处于活动状态。

该应用程序正在编写C#,.NET 3.5,Visual Studio 2008 SP1

当前解决scheme

目前,我正在向网站上的testing页发出networking请求,这将对网站进行testing,然后显示结果。

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

我假设,如果在这个调用过程中没有例外,那么一切都很好,UI可以开始。

这是最简单/正确的方式,还是有一些其他的鬼鬼祟祟的电话,我不知道在C#或更好的方式来做到这一点。

 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response == null || response.StatusCode != HttpStatusCode.OK) 

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

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

来自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); } 

假设WCF服务和网站在同一个Web应用程序中,您可以使用返回应用程序状态的“Status”WebService。 你可能想要做一些以下的事情:

  • testing数据库启动并运行(连接string正确,服务已启动等)
  • testing网站正在工作(具体取决于网站)
  • testingWCF正在工作(具体取决于您的实现)
  • 额外奖励:如果您将来需要支持不同的版本,则可以返回有关该服务的版本信息。

然后,您在WebService的Win.Forms应用程序上创build一个客户端。 如果WS没有响应(即你调用时出现一些exception),那么网站就会closures(就像“一般错误”)。
如果WS响应,则可以parsing结果并确保一切正常,或者如果有什么事情中断,则返回更多信息。

您需要检查状态码是否正确(状态200)。

解决scheme来自: 如何检查一个网站是否在C#中在线?

var ping = new System.Net.NetworkInformation.Ping();

var result = ping.Send(“www.google.com”);

如果(result.Status!= System.Net.NetworkInformation.IPStatus.Success)返回;