Ping命令检测网站运行状态

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协议,如果,采用的其他协议,需要修改代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值