开发者们对于IP跟踪系统并不陌生,Microsoft Visual Studio .NET 提供了许多类和方法来实现这一功能。本文不仅介绍了如何获取用户IP,还介绍了如何找到浏览ASP.NET应用程序用户的地理位置。例如,有一个ASP.NET应用程序,托管已经完成,网址假设为 "www.xyz.com",现在想要跟踪/维护访问者IP及其位置的日志,例如:
IP: XXX.XXX.XXX.XXX, 时间戳: 3/2/2010 4:18:39 PM, 国家= 孟加拉国, 国家代码= BD, 城市= 达卡, 等等。
快速概览:
在开始之前,需要了解一些基础知识,关于由Microsoft Visual Studio .Net提供的System.Net和System.Data命名空间,以及HTTP服务器变量。更多信息可以在找到。
如果在互联网上搜索解决方案,可能会找到许多方法。例如,可以使用Web服务或下载包含IP位置映射的数据库,但它们大多数不是免费的/每天只允许有限的访问次数...发现了一些网站允许免费获取用户位置信息,以下是一些网站列表:
注意:上述所有列出的地址都以标准XML格式回复。
在本节中,将讨论如何使用这些网站来检索用户地理位置。可以任选其一,在此之前需要知道所需的参数,让一个接一个地开始:
(i)
参数:IP地址(xxx.xxx.xxx.xxx)。
URL示例:http://freegeoip.appspot.com/xml/xxx.xxx.xxx.xxx
输出:标准XML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Status>true</Status>
<Ip>xxx.xxx.xxx.xxx</Ip>
<CountryCode>BD</CountryCode>
<CountryName>Bangladesh</CountryName>
<RegionCode>81</RegionCode>
<RegionName>Dhaka</RegionName>
<City>Dhaka</City>
<ZipCode></ZipCode>
<Latitude>23.723</Latitude>
<Longitude>90.4086</Longitude>
</Response>
(ii)
参数:IP地址 (xxx.xxx.xxx.xxx) & 许可证密钥。
URL示例:http://ws.cdyne.com/ip2geo/ip2geo.asmx/ResolveIP?ipAddress=xxx.xxx.xxx.xxx&licenseKey=0
输出:标准XML
<?xml version="1.0" encoding="utf-8"?>
<IPInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ws.cdyne.com/">
<City>Dhaka</City>
<StateProvince>81</StateProvince>
<Country>Bangladesh</Country>
<Organization/>
<Latitude>23.72301</Latitude>
<Longitude>90.4086</Longitude>
<AreaCode>0</AreaCode>
<TimeZone/>
<HasDaylightSavings>false</HasDaylightSavings>
<Certainty>90</Certainty>
<RegionName/>
<CountryCode>BD</CountryCode>
</IPInformation>
(iii)
参数:IP地址(xxx.xxx.xxx.xxx)。
URL示例:http://ipinfodb.com/ip_query.php?ip=xxx.xxx.xxx.xxx0
输出:标准XML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Ip>xxx.xxx.xxx.xxx</Ip>
<Status>OK</Status>
<CountryCode>BD</CountryCode>
<CountryName>Bangladesh</CountryName>
<RegionCode>81</RegionCode>
<RegionName>Dhaka</RegionName>
<City>Dhaka</City>
<ZipPostalCode></ZipPostalCode>
<Latitude>23.7231</Latitude>
<Longitude>90.4086</Longitude>
<Timezone>6</Timezone>
<Gmtoffset>6</Gmtoffset>
<Dstoffset>6</Dstoffset>
</Response>
使用了一个非常常见的技术。实际上,这只是使用HTTP服务器变量。以下是为此目的使用的服务器变量:
以下是代码示例:
private string GetVisitor()
{
string strIPAddress = string.Empty;
string strVisitorCountry = string.Empty;
strIPAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (strIPAddress == "" || strIPAddress == null)
strIPAddress = Request.ServerVariables["REMOTE_ADDR"];
Tools.GetLocation.IVisitorsGeographicalLocation _objLocation;
_objLocation = new Tools.GetLocation.ClsVisitorsGeographicalLocation();
DataTable _objDataTable = _objLocation.GetLocation(strIPAddress);
if (_objDataTable != null)
{
if (_objDataTable.Rows.Count > 0)
{
strVisitorCountry =
"IP: " + strIPAddress +
", TIMESTAMP: " + Convert.ToString(System.DateTime.Now) +
", CITY: " + Convert.ToString(_objDataTable.Rows[0]["City"]).ToUpper() +
", COUNTRY: " + Convert.ToString(_objDataTable.Rows[0]["CountryName"]).ToUpper() +
", COUNTRY CODE: " + Convert.ToString(_objDataTable.Rows[0]["CountryCode"]).ToUpper();
}
else
{
strVisitorCountry = null;
}
}
return strVisitorCountry;
}
要获取位置,只需要使用Microsoft Visual Studio .NET提供的以下内容:
更多信息可以在找到。
以下是代码示例:
public DataTable GetLocation(string strIPAddress)
{
// Create a WebRequest with the current Ip
WebRequest _objWebRequest = WebRequest.Create("http://freegeoip.appspot.com/xml/" + strIPAddress);
// Create a Web Proxy
WebProxy _objWebProxy = new WebProxy("http://freegeoip.appspot.com/xml/" + strIPAddress, true);
// Assign the proxy to the WebRequest
_objWebRequest.Proxy = _objWebProxy;
// Set the timeout in Seconds for the WebRequest
_objWebRequest.Timeout = 2000;
try
{
// Get the WebResponse
WebResponse _objWebResponse = _objWebRequest.GetResponse();
// Read the Response in a XMLTextReader
XmlTextReader _objXmlTextReader = new XmlTextReader(_objWebResponse.GetResponseStream());
// Create a new DataSet
DataSet _objDataSet = new DataSet();
// Read the Response into the DataSet
_objDataSet.ReadXml(_objXmlTextReader);
return _objDataSet.Tables[0];
}
catch
{
return null;
}
}
// End of GetLocation
希望这对有所帮助!享受。