【解决方案 十】判断URL请求是否成功并检测访问效率
最近在做的一个需求是这样的:要求判断某一个URL是否能请求到资源,并且计算该URL的执行效率。从网上找了一些方法,最终确定通过如下的方式来实现。
判断某一个URL是否能请求到资源
首先通过如下代码来对URL请求资源的返回内容做判断:
/// <summary>
/// 检测url是否有效
/// </summary>
/// <param name="url">url</param>
/// <returns></returns>
public static bool CheckOutUrlStatus(string url)
{
var result = false;
HttpWebRequest webRequst = null; //HTTP请求
HttpWebResponse webResponse = null; //HTTP会话
try
{
webRequst = (HttpWebRequest)WebRequest.Create(url); //创建http请求
webRequst.Method = "HEAD"; //设置请求类型为HEAD,只请求头部信息
webResponse = (HttpWebResponse)webRequst.GetResponse(); //获得http会话
if (webResponse.StatusCode == HttpStatusCode.OK) //请求成功
result = true;
}
catch (Exception)
{
}
finally
{
//关闭会话
if (webResponse != null)
webResponse.Close();
}
return result;
}
通过单元测试检测该接口的有效性
接口编写完毕后,通过两个不同的网址URL来监测接口是否符合要求:
检测HEAD请求和GET请求的性能
请求的方式有很多种,由于我们只需要获取是否访问能成功即可这样的结果,所以只需请求响应的头部信息即可。可以通过stopwatch函数来监测对应请求的访问性能。
[TestMethod]
public void TimeCheck()
{
var stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
#region 要执行的代码体
//需要监测的代码
const int count = 1000; //循环执行请求次数
var i = 0;
const string url = "http://www.baidu.cn";
while (i < count)
{
var resultRight = UrlHelper.CheckOutUrlStatus(url);
i++;
}
#endregion 要执行的代码体
stopwatch.Stop(); // 停止监视
var timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
var hours = timespan.TotalHours.ToString("#0.00000000 "); // 总小时
var minutes = timespan.TotalMinutes.ToString("#0.00000000 "); // 总分钟
var seconds = timespan.TotalSeconds.ToString("#0.00000000 "); // 总秒数
var milliseconds = timespan.TotalMilliseconds.ToString("#0.00000000 "); // 总毫秒数
Console.WriteLine(milliseconds);
}
通过单元测试对百度地址进行1000次请求,结果表现为,在HEAD请求状态下,共耗费时间4863毫秒,GET请求状态下,共耗费13554.95毫秒,大概是1:3的时间状态。
结论
通过以上内容的学习和分析,得出如下积累和输出:
- URL接口请求可用以上代码(CheckOutUrlStatus)来确定资源访问结果。
- 在同样的请求URL下,使用HEAD的效率高于GET,因为HEAD只请求了头部信息,检测的话最好用1000及以上次数,可以规避网络波动的影响。
- 可以用stopwatch来检测代码的执行效率。
以上就是这个需求过程中的收获。