如何确认访客所在的国家

简介: 在建设网站的时候,有时会遇到根据不同国家的访客显示不同信息的需求。尤其是网站所用语言的国际化要求,比如对美国的访客显示英语,对中国的访客显示中文。 有两种途径能够解决此问题。 一. 使用CultureInfo与RegionInfo类 1 2 3 4 5 6 7 ...

在建设网站的时候,有时会遇到根据不同国家的访客显示不同信息的需求。尤其是网站所用语言的国际化要求,比如对美国的访客显示英语,对中国的访客显示中文。

有两种途径能够解决此问题。

一. 使用CultureInfo与RegionInfo类

1
2
3
4
5
6
7
public  static  string  GetISORegionName(HttpRequest request)
{
     var  lan = request.UserLanguages.First();
     var  cultureInfo = CultureInfo.CreateSpecificCulture(lan);
     var  regionInfo = new  RegionInfo(cultureInfo.LCID);
     return  regionInfo.TwoLetterISORegionName;
}
  •  通过Request取得访客客户端所用语言
  •  由该语言代码生成CultureInfo
  •  由所生成的CultureInfo的LCID生成RegionInfo
  •  取得RegionInfo的TwoLetterISORegionName值,即ISO 3166中使用两位字母所代表的国家/地区

* 使用中文环境的客户端(zh-CN)会得到"CN"的结果,而使用英文环境的客户端(en-US)则会得到"US"。

* 这种方法很明显会有个问题,判断的结果依赖访客的客户端语言环境而非真实的所在国家地理位置。

二. 使用MaxMind的免费数据库及相关API

通过IP地址取得对应的国家地理位置,可以采用数据供应商所提供的数据库,以一般查询的方式获得相应的信息。不过这些数据库通常是需要付费的。

当然也有免费的产品,比如MaxMind发布的免费数据库。

数据库的下载地址:http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

需要用到的dll可以由NuGet方法取得, PM> Install-Package MaxMind.GeoIP2  ,安装完成后项目中会新加MaxMind.Db以及MaxMind.GeoIP2两个dll引用。

在调用GeoIP2的API之前,还需要完成一项工作,即取得访客的IP地址。

最简单的方式是使用 HttpContext.Current.Request.UserHostAddress ,不过在访客使用代理服务器的场景下,此方式所获得的IP地址就是不正确的了。

因此需要变更方法,改用下列的代码:

1
2
3
4
5
6
7
8
9
public  static  string  GetClientIpAddress(HttpRequest request)
{
     var  userHostAddress = request.UserHostAddress;
     var  xForwardedFor = request.ServerVariables[ "X_FORWARDED_FOR" ];
     if  ( string .IsNullOrEmpty(xForwardedFor))
         return  userHostAddress;
     var  forwardingIps = xForwardedFor.Split( ',' ).ToList();
     return  forwardingIps.Any() ? forwardingIps.Last() : userHostAddress;
}

当这一步完成后,就可以进入正题,调用GeoIP2的API以获得访客所处的国家。

1
2
3
4
5
6
7
8
9
public  static  string  GetISOCodeByMaxMind(HttpRequest request)
{
     using  ( var  reader = new  DatabaseReader(HttpContext.Current.Server.MapPath( "~/GeoLite2-Country.mmdb" )))
     {
         var  ipAddress = GetClientIpAddress(request);
         var  country = reader.Country(ipAddress);
         return  country.Country.IsoCode;
     }
}
  •  实例化DatabaseReader,将数据库所在路径作为其构造方法的参数
  •  取得客户端IP地址
  •  由IP地址查询所在国家
  •  得到国家的IsoCode,同样是ISO 3166中使用两位字母所代表的国家/地区

* 如果无法从数据库中取得对应信息,上述方法会抛出异常,所以在实际开发时有必要加上try/catch语句加以控制。

目录
相关文章
新鲜出炉!2016 中国互联网仿冒态势分析报告
本报告由阿里巴巴安全部和中国信息通信研究院联合出品。
3733 0
|
区块链
阿里云区块链服务通过国家互联网信息办公室第二批境内区块链信息服务备案
阿里云区块链服务通过国家互联网信息办公室第二批境内区块链信息服务备案
2393 0
|
云安全 安全
专家:端午将至湖北地区挂马网站激增 用户需警惕
据瑞星“云安全”系统监测,5月22日至24日,“湖北省麻城市第二实验小学”、“湖北师范学院教务处”、“湖北省团风县工商局红盾信息网”等网站被黑客挂马,用户浏览这些网站后,会感染近期变种最多的U盘蠕虫下载器病毒,电脑会被下载大量木马病毒。
1013 0
|
安全 网络安全
政府安全资讯精选 2018年第五期 网信办发布中央互联网新闻信息服务单位许可信息;全球网络安全中心在达沃斯经济论坛宣布成立;《2018年全球风险报告》,网络攻击威胁名列最高威胁之一
网信办发布中央互联网新闻信息服务单位许可信息;全球网络安全中心在达沃斯经济论坛宣布成立;《2018年全球风险报告》,网络攻击威胁名列最高威胁之一
1459 0
|
人工智能 安全 网络协议
政府安全资讯精选 2017年第十七期 全国各地开展打击整治网络侵犯公民个人信息犯罪专项行动;中共中央办公厅、国务院办公厅印发计划 IPv6规模部署提上日程
全国各地开展打击整治网络侵犯公民个人信息犯罪专项行动;中共中央办公厅、国务院办公厅印发计划 IPv6规模部署提上日程;美国北卡罗来纳州政府服务器遭勒索软件攻击
3621 0
|
安全 数据安全/隐私保护