最近在做的一个需求是这样的:要求判断某一个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来检测代码的执行效率。
以上就是这个需求过程中的收获。