博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何确认访客所在的国家
阅读量:7213 次
发布时间:2019-06-29

本文共 1911 字,大约阅读时间需要 6 分钟。

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

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

一. 使用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发布的免费数据库。

数据库的下载地址:

需要用到的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语句加以控制。

转载地址:http://xzrum.baihongyu.com/

你可能感兴趣的文章
pig---用户自定义函数(UDF)
查看>>
Exchange Server 2013多域名证书申请
查看>>
Android入门篇二:使用意图在Activity之间传递数据
查看>>
msmtp在RHEL6.5下的安装
查看>>
Windows server 2012 部署活动目录 AD
查看>>
Create Mview step by step
查看>>
nginx 403 Forbidden
查看>>
CentOS 6.4 64位系统U盘安装
查看>>
控制抽象之简化客户代码
查看>>
iptables命令结构之目标
查看>>
mysql 主从配置参数
查看>>
draggable columns vs copy column name in phpMyAdmin
查看>>
Weblogic以及Tomcat登录认证
查看>>
A Juggling Algorithm (旋转交换)
查看>>
set、vector与list的构造与排序的耗时测试
查看>>
java 类型转换
查看>>
JavaScript之eval() 函数
查看>>
系统开机过程
查看>>
国家安全教育
查看>>
Python模块之uuid
查看>>