网上实现IP定位地理位置的技术大部分是PHP和Java,.NET的我找了好久还是还没找到。黄某于是不自量力,经过几个小时的找资料,写代码,终于皇天不负有心人,基于.net的IP定位地理位置的网页实现了,如有同志有兴趣,不妨看看,最还能提些意见,感激不尽!
然后在VS2008中新建一个网站和一个类库,给网站添加Bin文件夹.
把下载下来的GeoIP-CSharp-1_2.zip解压出来,把将CS文件添加到类库中。其中有几个以Example结尾的文件不用加。不然重新生成会报错。然后将生成的dll文件添加到bin文件夹中。
stringIP="";
stringDomain="";
protectedvoid Page_Load(object sender, EventArgs e)
{
try
{
if (Request.QueryString.Count != 0)
Domain = Request.QueryString["q"].ToString();
if (Domain == "")
{
IP = IPAddress;
if (IP == "" || IP.Equals(null))
{
Response.Write("<script>alert(找不到IP地址!');</script>");
return;
}
}
else
{
if (!IsIPAddress(Domain))
{
IP = GetIPByDomain(Domain);
if (!IsIPAddress(IP))
{
Response.Write("<script>alert('找不到IP地址!');</script>");
return;
}
}
else
IP = Domain;
}
}
catch (Exception e1)
{
Response.Write("<script>alert('出错了!');</script>");
return;
}
LoadPage();
}
//获取IP地址
publicstatic string IPAddress
{
get
{
string result = String.Empty;
result =HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (result != null && result !=String.Empty)
{
//可能有代理
if (result.IndexOf(".") ==-1)
//没有“.”肯定是非IPv4格式
result = null;
else
{
if (result.IndexOf(",") != -1)
{
//有“,”,估计多个代理。取第一个不是内网的IP。
result = result.Replace(" ", "").Replace("'", "");
string[] temparyip = result.Split(",;".ToCharArray());
for (int i = 0; i < temparyip.Length; i++)
{
if (IsIPAddress(temparyip[i])
&& temparyip[i].Substring(0, 3) !="10."
&& temparyip[i].Substring(0, 7) !="192.168"
&& temparyip[i].Substring(0, 7) !="172.16.")
{
returntemparyip[i];
//找到不是内网的地址
}
}
}
else if (IsIPAddress(result))
//代理即是IP格式
return result;
else
result =null;
//代理中的内容非IP,取IP
}
}
string IpAddress =(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!= null &&HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!= String.Empty) ?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]: HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
//if (IpAddress == "127.0.0.1" || IpAddress=="localhost")
//
result =Dns.GetHostEntry(Dns.GetHostName()).AddressList[5].ToString();
using (System.Net.WebClient wc = new System.Net.WebClient())
{
result = wc.DownloadString("http://www.zu14.cn/ip/");
//用自己的电脑访问http://www.zu14.cn/ip/获取IP地址
}
if (null == result || result == String.Empty)
result =HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (result == null || result == String.Empty)
result = HttpContext.Current.Request.UserHostAddress;
return result;
}
}
publicstatic bool IsIPAddress(string str1)
//判断是不是IP地址的格式
{
if (str1 == null || str1 == string.Empty || str1.Length< 7 || str1.Length > 15) returnfalse;
string regformat =@"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$";
Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
return regex.IsMatch(str1);
}
publicstring GetIPByDomain(string url)
//根据域名取得IP地址
{
if (url.Trim() == string.Empty)
return "";
try
{
System.Net.IPHostEntry host =System.Net.Dns.GetHostEntry(url);
return host.AddressList.GetValue(0).ToString();
}
catch
{
return "";
}
}
public voidLoadPage()
{
try
{
LookupService ls = newLookupService("C:/Users/hzh-PC/Desktop/GeoLiteCity.dat",LookupService.GEOIP_STANDARD);
//使用MaxMind的API
//get city location of the ip address
if (IP != null)
{
Location l = new Location();
l = ls.getLocation(IP);
if (l != null)
{
string fun= "loadGeoInfo("+
'"' + Domain + "\"," +
'"'+ IP +"\","+
'"'+ l.countryCode + "\","+
'"'+ l.countryName +"\","+
'"'+ l.regionName +"\","+
'"' + l.city + "\"," +
l.latitude +',' +
l.longitude+")";
Response.Write(fun);
}
else
{
Response.Write("<script>alert('找不到IP地址!');</script>");
return;
}
}
else
{
Response.Write("<script>alert('找不到IP地址!!');</script>");
return;
}
}
catch (Exception e)
{
Response.Write("<script>alert('错误:" +e.Message + "');</script>");
}
}
}
该页面的默认是获得自己电脑的IP的信息,可以通过SearchIP?q=
XXX来获取特定IP或域名的信息。
运行结果: