如何确认访客所在的国家
2014-08-28 16:35 狼人:-) 阅读(429) 评论(0) 编辑 收藏 举报在建设网站的时候,有时会遇到根据不同国家的访客显示不同信息的需求。尤其是网站所用语言的国际化要求,比如对美国的访客显示英语,对中国的访客显示中文。
有两种途径能够解决此问题。
一. 使用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语句加以控制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2011-08-28 艾伟:【翻译】使用ASP.NET 2.0记录错误
2011-08-28 艾伟:ASP.NET 与 AJAX的实现方式
2011-08-28 艾伟:Visual Studio 2008 到底有多强
2011-08-28 艾伟:学习ASP.NET比较完整的流程
2011-08-28 艾伟:一个让人遗忘的角落--Exception(一)
2011-08-28 艾伟:Gridview自定义排序且显示上下箭头
2011-08-28 艾伟:一步一步学WF系列(三)