小编最近遇到了一个问题,网站发布之后,及时获取网站的运行状态
可以把一个网站的很多页面,或者说很多网站的基本信息,配置在XML中
通过,读取XML文件,定时的检测网站的运行状态,记录数据库日志,如果出现问题,第一时间邮件或者其他方式,通知网站维护人员
新建控制台应用程序
效果
后台代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
#region 主函数
public static void Main(string[] args)
{
// 获取输入要访问的网址
string url=null;
Console.Write("请输入要访问的网址:");
url = Convert.ToString(Console.ReadLine());
// 验证网址的格式
bool result=judgeReg(url);
// 网址的格式
string urlFormat = "网址的格式正确。";
if (result==false)
{
urlFormat = "网址的格式不正确!";
Console.WriteLine(urlFormat);
Console.ReadKey();
return;
}
// 检测网站的状态
string status = judgeStatus(url);
// http的状态码
string errorCode = status.Substring(0, 3);
// 错误信息
string errorMessage = status.Substring(3);
// 错误详情
string detailsMessage = judegDetails(errorCode);
//输出
Console.WriteLine(urlFormat);
Console.WriteLine(errorCode);
Console.WriteLine(errorMessage);
Console.WriteLine(detailsMessage);
Console.ReadKey();
}
#endregion
#region 验证网址的格式
/// <summary>
/// 验证网址的格式
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static bool judgeReg(string url)
{
bool result=false;
if (url != null && url != "")
{
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(url)){
result=true;
}
}
return result;
}
#endregion
#region 检测网页的状态
/// <summary>
/// 检测网页的状态
/// </summary>
/// <param name="url">网址URL</param>
/// <returns></returns>
public static string judgeStatus(string url)
{
// http的状态码,错误信息
int errorCode = 0;
string errorMessage = null;
try
{
WebRequest request = WebRequest.Create(url);
request.Method = "HEAD";
request.Timeout = 1000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//StatusCode为枚举类型,200为正常
//其他输出为异常,需要转为int型,才会输出状态码
errorCode = Convert.ToInt32(response.StatusCode);
errorMessage = response.StatusCode.ToString();
response.Close();
}
catch (WebException ex)
{
if (ex.Response != null)
{
errorCode = Convert.ToInt32(((HttpWebResponse)ex.Response).StatusCode);
errorMessage = ((HttpWebResponse)ex.Response).StatusCode.ToString();
}
else
{
errorCode = 000;
errorMessage = "网站不存在!";
}
}
return errorCode + errorMessage;
}
#endregion
#region 检测网址的详细信息
/// <summary>
/// 检测网址的详细信息
/// </summary>
/// <param name="errorCode">错误代码</param>
/// <returns></returns>
public static string judegDetails(string errorCode)
{
// 错误详情
string detailMessage="";
int code=Convert.ToInt32(errorCode);
// 判断状态码
switch(code)
{
case 000:
detailMessage="网址不存在。";
break;
case 100:
detailMessage = "继续,请求者应当继续提出请求。";
break;
case 101:
detailMessage = "切换协议,请求者已要求服务器切换协议,服务器已确认并准备进行切换。";
break;
case 200:
detailMessage = "成功,服务器已成功处理了请求。";
break;
case 201:
detailMessage = "已创建,请求成功且服务器已创建了新的资源。";
break;
case 202:
detailMessage = "已接受,服务器已接受了请求,但尚未对其进行处理。";
break;
case 203:
detailMessage = "非授权信息,服务器已成功处理了请求,但返回了可能来自另一来源的信息。";
break;
case 204:
detailMessage = "无内容,服务器成功处理了请求,但未返回任何内容。";
break;
case 205:
detailMessage = "重置内容,服务器成功处理了请求,但未返回任何内容。";
break;
case 206:
detailMessage = "部分内容,服务器成功处理了部分 GET 请求。";
break;
case 300:
detailMessage = "多种选择,服务器根据请求可执行多种操作。";
break;
case 301:
detailMessage = "永久移动,请求的网页已被永久移动到新位置。";
break;
case 302:
detailMessage = "临时移动,服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。";
break;
case 303:
detailMessage = "查看其他位置,当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。";
break;
case 304:
detailMessage = "未修改,自从上次请求后,请求的网页未被修改过。";
break;
case 305:
detailMessage = "使用代理,请求者只能使用代理访问请求的网页。";
break;
case 307:
detailMessage = "临时重定向,服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。";
break;
case 400:
detailMessage = "错误请求,服务器不理解请求的语法。";
break;
case 401:
detailMessage = "身份验证错误,此页要求授权。";
break;
case 403:
detailMessage = "禁止,服务器拒绝请求。";
break;
case 404:
detailMessage = "未找到,服务器找不到请求的网页。";
break;
case 405:
detailMessage = "方法禁用,禁用请求中指定的方法。";
break;
case 406:
detailMessage = "不接受,无法使用请求的内容特性响应请求的网页。";
break;
case 407:
detailMessage = "需要代理授权,指定请求者必须授权使用代理。";
break;
case 408:
detailMessage = "请求超时,服务器等候请求时发生超时。";
break;
case 409:
detailMessage = "冲突,服务器在完成请求时发生冲突。";
break;
case 410:
detailMessage = "已删除,请求的资源永久删除后,服务器返回此响应。";
break;
case 411:
detailMessage = "需要有效长度,服务器不接受不含有效内容长度标头字段的请求。";
break;
case 412:
detailMessage = "未满足前提条件,服务器未满足请求者在请求中设置的其中一个前提条件。";
break;
case 413:
detailMessage = "请求实体过大,服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。";
break;
case 414:
detailMessage = "请求的 URI 过长,请求的 URI(通常为网址)过长,服务器无法处理。";
break;
case 415:
detailMessage = "不支持的媒体类型,请求的格式不受请求页面的支持。";
break;
case 416:
detailMessage = "请求范围不符合要求,如果页面无法提供请求的范围,则服务器会返回此状态码。";
break;
case 417:
detailMessage = "未满足期望值,服务器未满足”期望”请求标头字段的要求。";
break;
case 500:
detailMessage = "服务器内部错误,服务器遇到错误,无法完成请求。";
break;
case 501:
detailMessage = "尚未实施,服务器不具备完成请求的功能。";
break;
case 502:
detailMessage = "错误网关,服务器作为网关或代理,从上游服务器收到无效响应。";
break;
case 503:
detailMessage = "服务不可用,服务器目前无法使用(由于超载或停机维护)。";
break;
case 504:
detailMessage = "网关超时,服务器作为网关或代理,但是没有及时从上游服务器收到请求。";
break;
case 505:
detailMessage = "HTTP 版本不受支持,服务器不支持请求中所用的 HTTP 协议版本。";
break;
default:
detailMessage = "网页不存在!";
break;
}
return detailMessage;
}
#endregion
}
}
这里,可以检测网站的地址是否正确,以及网站当前的运行状态
返回状态码和状态码的描述信息