我正在寻找地理位置我的服务器请求按大洲。
基本上,在做了一些初步的研究后,似乎有三种方法: 1)使用浏览器提供的地理位置(但我认为当浏览器请求使用地理位置的许可时,没有人认真地单击“是”);2)获取IP地址列表,将该列表放在服务器上的数据库中,然后每次有请求进入时,从这个数据库读取;我不喜欢在每个请求时都必须访问数据库。3)向外部服务器发出HTTP调用以获取位置;这甚至可能比2)慢。
基本上,我真的不想知道用户的确切位置,我只需要知道他们在哪个大陆:北阿梅里卡,欧洲……
有没有一种方法可以做到这一点,不需要任何用户交互,也不需要在每次请求时都读取数据库?当我访问www.intel.com时,我会自动重定向到法语站点;他们是如何做到这一点的?
谢谢你的建议。
发布于 2012-11-20 04:47:24
有一些免费的和一些商业数据库,可以告诉你从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,它仍然与商业广告一起发布免费数据库。
发布于 2012-11-20 04:41:33
以前,当他们请求访问我的防火墙时,我就用它来定位IP地址。不确定这是否是您要找的,但它可能会有所帮助。
http://www.geobytes.com/iplocator.htm
https://stackoverflow.com/questions/13461803
复制相似问题