我正在寻找测试网站是否在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();
我假设如果在此调用期间没有异常,那么一切都很好,UI可以启动。
这是最简单,正确的方式,还是在C#中我还不知道其他一些偷偷摸摸的电话,或者是更好的方法。
答案 0 :(得分:79)
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response == null || response.StatusCode != HttpStatusCode.OK)
答案 1 :(得分:19)
使用WebResponse时请确保关闭响应流即(.close)否则在重复执行后会挂起机器。 例如
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// your code here
response.Close();
答案 2 :(得分: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);
}
答案 3 :(得分:3)
假设WCF服务和网站位于同一个Web应用程序中,您可以使用返回应用程序状态的“Status”WebService。您可能想要执行以下某些操作:
然后,在WebService的Win.Forms应用程序上创建一个客户端。如果WS没有响应(即你在调用时遇到一些异常),那么网站就会关闭(就像“一般错误”)。
如果WS响应,您可以解析结果并确保一切正常,或者如果某些内容被破坏,则返回更多信息。
答案 4 :(得分:2)
我们今天可以使用HttpClient()更新答案:
HttpClient Client = new HttpClient();
var result = await Client.GetAsync("https://stackoverflow.com");
int StatusCode = (int)result.StatusCode;
答案 5 :(得分:-2)
您需要检查状态代码是否正常(状态200)。
答案 6 :(得分:-4)
解决方案来自: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;