3

我正在寻找按大陆对我的服务器请求进行地理定位。

基本上,在做了一些初步研究之后,似乎有3种方法:1)使用浏览器提供的地理定位(但我认为当浏览器请求使用地理定位的权限时,没有人认真点击“是”);2)获取IP地址列表,将该列表放入服务器上的数据库中,然后每次请求进入时,从该数据库中读取;我不想在每次请求时都必须访问数据库。3) 对外部服务器进行 HTTP 调用以获取位置;这甚至可能比 2) 慢。

基本上,我并不在乎确切地知道用户在哪里,我只需要知道他们在哪个大陆:北美洲,欧洲......

有没有一种不需要任何用户交互并且不需要在每个请求上读取数据库的方法?当我访问 www.intel.com 时,我会自动重新路由到法语站点;他们是怎么做到的?

感谢您的建议。

4

3 回答 3

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,然后搜索数据库,这个 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 仍然与商业广告一起发布免费数据库。

于 2012-11-19T20:47:24.313 回答
0

在他们请求访问我的防火墙之前,我已经使用它来地理定位 IP 地址。不确定这是否是您正在寻找的,但它可能会有所帮助。

http://www.geobytes.com/iplocator.htm

于 2012-11-19T20:41:33.467 回答
0

似乎您更喜欢第二种变体,但您不需要在每个请求上都访问数据库 - 例如,只需将结果缓存在 cookie 中。

还有一点疯狂 - 只是为了让您考虑额外数据库请求的成本:您可以根据需要转换一些地理数据库(寻找 Aristos 的答案)。每个 IP 都可以转换为 Int64,您可以制作大陆范围,同时将 DB 转换为您的格式。例如,0-10000 将是北美,10000-20000 - 欧洲,20000-30000 - 北美,依此类推,这样转换后的唯一任务就是找出这些范围内的 IP。

但是你必须做大量的工作来执行这样的转换,并且不要忘记更新它会非常头疼:IP-base 不是恒定的。
因此,DB 请求 + 缓存可能是最好的选择。

于 2012-11-19T21:13:00.157 回答