Ping命令检测网站运行状态
最近,小编在项目中遇到一个问题,检测服务上网站的运行状况,其中,用到了Ping命令来测试
Ping的是什么?IP地址或者域名
DNS:正向解析,将域名转换成IP地址,域名解析协议
RDNS:反向解析,将IP地址转换成域名
主要包含三步
第一, 检测本地网络连接状态
第二, 检测与服务器的网络连接状态
第三, 检测服务器上网站的运行状态
代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text.RegularExpressions;
using System.Web;
using WebDetection.Model;
namespace WebDetection
{
public class DetectionWeb
{
#region 检测网站运行状态
/// <summary>
/// 检测网站运行状态
/// </summary>
/// <returns></returns>
public static bool CheckWeb()
{
// 获取xml文件
List<WebXMLmodel> list = OperateXML.readXML();
foreach (WebXMLmodel listItem in list)
{
// 获取检查网址
string WebUrl = listItem.weburl.Trim();
// 检查网站的格式
bool Format = FormatWebUrl(WebUrl);
if (Format == false)
{
listItem.httpdescription = "网站的网址格式不正确!";
listItem.Webstate = "失败";
return true;
}
// 检查与服务器的连接状态
bool Result = PingWebUrl(WebUrl);
if (Result == false)
{
listItem.httpdescription = "无法Ping通网站!";
listItem.Webstate = "失败";
return true;
}
// 检测网站的运行状态
string str = CheckWebStatus(WebUrl);
// http的状态码
string httpcode = str.Substring(0, 3);
// http的返回值
string httpresult = str.Substring(3);
// http状态码详情
string httpdescription = Checkhttpcode(httpcode);
// 循环遍历赋值
listItem.httpcode = httpcode;
listItem.httpresult = httpresult;
listItem.httpdescription = httpdescription;
// 网站访问是否成功
if (httpcode == "200")
{
listItem.Webstate = "成功";
listItem.ismail = "未发送";
}
else
{
listItem.Webstate = "失败";
}
// 更新当前网站的状态
bool flag = OperateXML.writeXML(list);
}
return true;
}
#endregion
#region 检测当前网络状态
/// <summary>
/// 检测当前网络状态
/// </summary>
/// <returns></returns>
public static bool Ping()
{
bool PinhRight = false;
try
{
// Ping百度
Ping Ping = new Ping();
string WebUrl = "www.baidu.com";
PingReply ReCode = Ping.Send(WebUrl);
// Ping 成功!
if (ReCode.Status == IPStatus.Success)
{
PinhRight = true;
}
return PinhRight;
}
catch
{
return PinhRight;
}
}
#endregion
#region 检查网址格式是否正确
/// <summary>
/// 检查网址格式是否正确
/// </summary>
/// <param name="WebUrl"></param>
/// <returns></returns>
public static bool FormatWebUrl(string WebUrl)
{
bool result = false;
if (WebUrl != null && WebUrl != "")
{
var strRegex = @"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&$%\$#\=~])*$";
Regex re = new Regex(strRegex);
if (re.IsMatch(WebUrl))
{
result = true;
}
}
return result;
}
#endregion
#region Ping网站网址
/// <summary>
/// Ping网站网址
/// </summary>
/// <param name="WebUrl"></param>
/// <returns></returns>
public static bool PingWebUrl(string WebUrl)
{
// 移除所有空白字符
WebUrl = WebUrl.Trim();
// 判断协议,http、https
string deal = WebUrl.ToLower().Substring(0, 5);
// 网址截止位置
int index;
// 需要Ping的网址
string PingWeb;
// https协议
if (deal == "https")
{
// 从第8位开始,搜索返回第一个"/"号出现的位置
// 默认下标从0开始
index = WebUrl.ToLower().IndexOf('/', 8);
if (index == -1)
{
// 从第8位开始,包含第8位,取到结尾
PingWeb = WebUrl.Substring(8);
}
else
{
// 从第8位开始,取index-8个字符
PingWeb = WebUrl.Substring(8, index-8);
}
}
else
{
// http协议
// 从第7位开始,搜索返回第一个"/"号出现的位置
// 默认下标从0开始
index = WebUrl.ToLower().IndexOf('/', 7);
if (index == -1)
{
// 从第8位开始,包含第7位,取到结尾
// 默认下标从0开始
PingWeb = WebUrl.Substring(7);
}
else
{
// 从第7位开始,取index-7个字符
PingWeb = WebUrl.Substring(7, index-7);
}
}
// Ping网址
bool PingResult = PingWebAddress(PingWeb);
return PingResult;
}
#endregion
#region 检测与服务器的网络连接状态
/// <summary>
/// 检测与服务器的网络连接状态
/// </summary>
/// <param name="WebUrl"></param>
/// <returns></returns>
public static bool PingWebAddress(string PingWebAddress)
{
bool PinhRight = false;
try
{
Ping Ping = new Ping();
PingReply ReCode = Ping.Send(PingWebAddress);
//Ping 成功!
if (ReCode.Status == IPStatus.Success)
{
PinhRight = true;
}
return PinhRight;
}
catch
{
return PinhRight;
}
}
#endregion
#region 检测网站的状态
/// <summary>
/// 检测网站的状态
/// </summary>
/// <param name="url">网站URL</param>
/// <returns></returns>
public static string CheckWebStatus(string WebUrl)
{
// http的状态码,错误信息
int httpcode = 000;
string httpresult = null;
try
{
WebRequest request = WebRequest.Create(WebUrl);
request.Method = "HEAD";
request.Timeout = 1000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//StatusCode为枚举类型,200为正常
//其他输出为异常,需要转为int型,才会输出状态码
httpcode = Convert.ToInt32(response.StatusCode);
httpresult = response.StatusCode.ToString();
response.Close();
}
catch (WebException ex)
{
if (ex.Response != null)
{
httpcode = Convert.ToInt32(((HttpWebResponse)ex.Response).StatusCode);
httpresult = ((HttpWebResponse)ex.Response).StatusCode.ToString();
}
else
{
httpcode = 000;
httpresult = "网站不存在!";
}
}
return httpcode + httpresult;
}
#endregion
#region 检测网站的详细信息
/// <summary>
/// 检测网站的详细信息
/// </summary>
/// <param name="errorCode">错误代码</param>
/// <returns></returns>
public static string Checkhttpcode(string httpcode)
{
// 错误详情
string httpdescript = "";
int code = Convert.ToInt32(httpcode);
// 判断状态码
switch (code)
{
case 000:
httpdescript = "网址不存在。";
break;
case 100:
httpdescript = "继续,请求者应当继续提出请求。";
break;
case 101:
httpdescript = "切换协议,请求者已要求服务器切换协议,服务器已确认并准备进行切换。";
break;
case 200:
httpdescript = "成功,服务器已成功处理了请求。";
break;
case 201:
httpdescript = "已创建,请求成功且服务器已创建了新的资源。";
break;
case 202:
httpdescript = "已接受,服务器已接受了请求,但尚未对其进行处理。";
break;
case 203:
httpdescript = "非授权信息,服务器已成功处理了请求,但返回了可能来自另一来源的信息。";
break;
case 204:
httpdescript = "无内容,服务器成功处理了请求,但未返回任何内容。";
break;
case 205:
httpdescript = "重置内容,服务器成功处理了请求,但未返回任何内容。";
break;
case 206:
httpdescript = "部分内容,服务器成功处理了部分 GET 请求。";
break;
case 300:
httpdescript = "多种选择,服务器根据请求可执行多种操作。";
break;
case 301:
httpdescript = "永久移动,请求的网页已被永久移动到新位置。";
break;
case 302:
httpdescript = "临时移动,服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。";
break;
case 303:
httpdescript = "查看其他位置,当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。";
break;
case 304:
httpdescript = "未修改,自从上次请求后,请求的网页未被修改过。";
break;
case 305:
httpdescript = "使用代理,请求者只能使用代理访问请求的网页。";
break;
case 307:
httpdescript = "临时重定向,服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。";
break;
case 400:
httpdescript = "错误请求,服务器不理解请求的语法。";
break;
case 401:
httpdescript = "身份验证错误,此页要求授权。";
break;
case 403:
httpdescript = "禁止,服务器拒绝请求。";
break;
case 404:
httpdescript = "未找到,服务器找不到请求的网页。";
break;
case 405:
httpdescript = "方法禁用,禁用请求中指定的方法。";
break;
case 406:
httpdescript = "不接受,无法使用请求的内容特性响应请求的网页。";
break;
case 407:
httpdescript = "需要代理授权,指定请求者必须授权使用代理。";
break;
case 408:
httpdescript = "请求超时,服务器等候请求时发生超时。";
break;
case 409:
httpdescript = "冲突,服务器在完成请求时发生冲突。";
break;
case 410:
httpdescript = "已删除,请求的资源永久删除后,服务器返回此响应。";
break;
case 411:
httpdescript = "需要有效长度,服务器不接受不含有效内容长度标头字段的请求。";
break;
case 412:
httpdescript = "未满足前提条件,服务器未满足请求者在请求中设置的其中一个前提条件。";
break;
case 413:
httpdescript = "请求实体过大,服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。";
break;
case 414:
httpdescript = "请求的 URI 过长,请求的 URI(通常为网址)过长,服务器无法处理。";
break;
case 415:
httpdescript = "不支持的媒体类型,请求的格式不受请求页面的支持。";
break;
case 416:
httpdescript = "请求范围不符合要求,如果页面无法提供请求的范围,则服务器会返回此状态码。";
break;
case 417:
httpdescript = "未满足期望值,服务器未满足”期望”请求标头字段的要求。";
break;
case 500:
httpdescript = "服务器内部错误,服务器遇到错误,无法完成请求。";
break;
case 501:
httpdescript = "尚未实施,服务器不具备完成请求的功能。";
break;
case 502:
httpdescript = "错误网关,服务器作为网关或代理,从上游服务器收到无效响应。";
break;
case 503:
httpdescript = "服务不可用,服务器目前无法使用(由于超载或停机维护)。";
break;
case 504:
httpdescript = "网关超时,服务器作为网关或代理,但是没有及时从上游服务器收到请求。";
break;
case 505:
httpdescript = "HTTP 版本不受支持,服务器不支持请求中所用的 HTTP 协议版本。";
break;
default:
httpdescript = "网页不存在!";
break;
}
return httpdescript;
}
#endregion
}
}
检测本地的网络连接状况,通过ping百度实现
检测本地与服务器的网络连接状况,通过ping服务器实现
检测服务器上网站的运行状态,通过网站http协议的状态码和返回值实现,这里只能适用于http和https协议,如果,采用的其他协议,需要修改代码