最近在做的一個需求是這樣的:要求判斷某一個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來檢測代碼的執行效率。
以上就是這個需求過程中的收穫。