今天檢測本機IP的時候,本來是隻需要檢測出來内網IP的,突然對擷取外網IP的方法有了些興趣,就去網上搜了一下。
網上的方法倒是挺一緻,連接配接可以查詢IP的網站,然後傳回這個網頁的資訊,用正規表達式檢索出來,雖然相當于沒有在本地實作,但是隻要能擷取到,結果都是一樣的,我就代碼加上試了一下,但是,調用GetResponse()傳回:遠端伺服器傳回錯誤: (403) 已禁止,這算是怎麼回事?大神們的代碼都不調試的嗎?寫完都不看結果的嗎?
代碼如下,大家可以試試:
string str = GetPage("http://www.123cha.com");
static string GetPage(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
try
{
using(HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
return sr.ReadToEnd();
}
}
}
catch (System.Exception e)
{
return e.Message;
}
finally
{
req.Abort();
}
}
網上找了好久,試了一下,給http标頭指派,問題解決了,UserAgent預設的值是null,應該是這個網站的問題,使用預設值,我連接配接百度和谷歌是沒有問題的。對于UserAgent的指派标準不太了解,但是測試的結果是不能為null和空字元串,随便指派都可以。
req.UserAgent = "hello web";添加之後沒問題了。
然後再說下一個問題,關于正規表達式的比對,在擷取到的界面中查詢IP的時候,@"IP: \[(?<IP>[0-9\.]*)\]",我不知道為什麼要這麼檢索,理論上我需要查詢的隻是IP位址,具體這個位址前面加不加IP:之類的東西我完全不需要關心,而且,這個檢測IP的也不對,IP位址的規則是不可能0-9都行的。
完整代碼如下,測試通過:
string patt = @"((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[1-9])";
string url = "http://www.123cha.com";
string str = Regex.Match(GetPage(url), patt).Value;
static string GetPage(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
try
{
req.UserAgent = "hello web";
using(HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
return sr.ReadToEnd();
}
}
}
catch (System.Exception e)
{
return e.Message;
}
finally
{
req.Abort();
}
}
本來挺簡單的一個功能,查問題查了一個晚上,大家寫出來的東西,還是最好能保證測試通過吧,穩定性,健壯性,異常什麼的不說,但是總不能一次都成功不了吧。http頭的規範我還是有些疑惑,以後再看吧。