我正在寻求按大陆地理定位我的服务器请求。
基本上,经过一些初步研究后,似乎有3种方法:1)使用浏览器提供的地理定位(但我认为当浏览器要求允许使用地理定位时,没有人认真点击“是”); 2)获取IP地址列表,将该列表放在服务器上的数据库中,然后每次请求进入时,从该DB读取;我不想在每次请求时都要打DB。 3)对外部服务器进行HTTP调用以获取位置;甚至可能比2)慢。
基本上,我并不在乎确切知道用户的确切位置,我只需知道他们所在的大陆:North Armerica,Europe ......
有没有办法做到这一点,不需要任何用户交互,也不需要在每个请求上读取数据库?当我去www.intel.com时,我会自动转到法国网站;他们是怎么做到的?
感谢您的建议。
答案 0 :(得分:7)
有一些免费和一些商业数据库可以告诉你ip,来自哪里。
maxmind [*]的免费数据库:http://dev.maxmind.com/geoip/geolite
和两个广告:
http://www.ip2location.com
http://www.maxmind.com
在这个站点中,您还可以找到有关如何使用该数据的asp.net示例,还可以使用其他可以使用的免费服务,并查看其使用来源。
将api样本与数据库一起获取:http://www.maxmind.com/download/geoip/
如果只有国家/地区,那么此数据库文件
http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
仅包含国家/地区,与其他国家相比较小。
如何解决这个问题:数据库的格式为:
"1.20.0.0","1.20.255.255","18087936","18153471","TH","Thailand"
"1.21.0.0","1.21.255.255","18153472","18219007","JP","Japan"
"1.22.0.0","1.23.255.255","18219008","18350079","IN","India"
"1.24.0.0","1.31.255.255","18350080","18874367","CN","China"
长号是ip的翻译。因此,您阅读了用户的IP,然后使用函数将其转换为long,然后搜索数据库,这个长数适合于哪里。
public long addrToNum(IPAddress Address)
{
byte[] b = BitConverter.GetBytes(Address.Address);
if (b.Length == 8)
return (long)(((long)16777216 * b[0]) + ((long)(65536 * b[1])) + ((long)(256 * b[2])) + b[3]);
else
return 0;
}
因此,如果您将它们添加到数据库中,那么您可以在这个长数字上索引数据库并查看ip所在的位置:
Select TOP 1 * from GeoIPCountryWhois WITH (NOLOCK) Where @myIpToLong BETWEEN begin_num AND end_num
将结果缓存在会话变量上并且不会在每个页面请求上反复搜索。
[*]非常感谢maxmind,它仍然与商业广告一起发布免费数据库。
答案 1 :(得分:0)
在他们请求访问我的防火墙之前,我已经使用它来对地址进行地理定位。不确定这是否是您正在寻找的,但它可能有所帮助。
答案 2 :(得分:0)
您似乎更喜欢第二种变体,但您不需要在每个请求上点击数据库 - 例如,只需将结果缓存在Cookie中。
还有一点点精神错乱 - 只是为了让你考虑额外数据库请求的成本:你可以根据需要转换一些地理数据库(寻找Aristos的答案)。每个IP都可以转换为Int64,您可以创建大陆范围,同时将DB转换为您的格式。例如,0-10000将是北美,10000-20000 - 欧洲,20000-30000 - 北美再次等等,此类转换后的唯一任务是发现这些范围内的IP。
但是你必须做出巨大的努力才能进行这样的转换,并且不要忘记更新它真的很大 butthurt 头痛:IP-base不是常数。<登记/>
因此,DB请求+缓存可能是最好的选择。