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

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

一. 使用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语句加以控制。

如何确认访客所在的国家相关推荐

  1. php跳转分站,根据访客所在城市ip地址自动跳转到分站的php代码

    //php教程获取ip的算法 $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR&quo ...

  2. 给你的网站添加3D地球显示的访客统计(使用RevolverMaps)

    与我们平时使用的百度统计.cnzz统计不同,这个是显示一个旋转的地球(当然也有2D的全球地图版的),在这个图上左上角显示的是访客的数量,左下角是一个控制面板,可以操控地球旋转.放大或者缩小.在地球上访 ...

  3. 收藏~六大网站访客类型及应对方式

    收藏!六大网站访客类型及应对方式! 当涉及到与潜在客户接触时,速度是关键.毕竟,当一个潜在客户来到你的网站时,你只有10秒钟的时间来捕捉他们的兴趣.我们把这种主动的方法称为 "扑捉" ...

  4. 企业应该如何选择访客管理系统?

    目前,访客管理方式主要分为以下三类:一是手工登记来访人员信息,前台/安保工作人员确认通过;二是计算机系统验证身份信息,前台/安保工作人员发放通行证件/访客卡;三是访客通过访客端自助登记信息,被访者来确 ...

  5. 如何选择智能访客管理系统?

    目前,访客管理方式主要分为以下三类:一是手工登记来访人员信息,前台/安保工作人员确认通过;二是计算机系统验证身份信息,前台/安保工作人员发放通行证件/访客卡;三是访客通过访客端自助登记信息,被访者来确 ...

  6. 电子证书管理系统前台_访客管理系统是什么?公司需要访客管理系统吗?

    访客管理系统是什么?公司需要访客管理系统吗? 上一篇给大家介绍了电子签到是什么,电子签到包含了访客管理系统,今天智能会议哥还整理了一篇关于访客管理系统的介绍,也许大家没听过访客管理系统,那么今天就给大 ...

  7. php ip获取邮政编码,php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法...

    这篇文章主要介绍了php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法,通过一个API接口调用实现针对访客信息的相关查询功能,非常简单实用, 本文实例讲述了php获取指定(访客) ...

  8. php ip获取邮政编码,php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法,所有信息经纬度...

    php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法,所有信息经纬度 本文实例讲述了php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法.分享给大家供大家参 ...

  9. SSM+天山产业园访客与疫情防控系统 毕业设计-附源码191123

    摘  要 如今计算机行业的发展极为快速,搭载于计算机软件运行的数据库管理系统在各行各业得到了广泛的运用,其在数据管理方面具有的准确性和高效性为大中小企业的日常运营提供了巨大的帮助.自从2020年新冠疫 ...

最新文章

  1. 抗击疫情!阿里云为加速新药疫苗研发提供免费AI算力
  2. 马斯克采访:要么死的安然,要么活得绚烂
  3. Winform中在FastReport的PreviewControl预览控件中对report控件模板中控件值进行修改
  4. 8K 星!这可能是最适合你的 TensorFlow 教程
  5. 【APICloud系列|26】UIScrollPicture 模块(图片轮播)的实现
  6. 数组方法大全ES5+ES6
  7. 分享制作精良的知识管理系统 配置SQL Server文档数据库 完美实现博客文章的的下载,存储和浏览...
  8. 虚拟邮箱怎么设置方法_腾讯企业邮箱邮件列表白名单设置方法
  9. HtmlHelper扩展 及 页面编码化
  10. (篇十)用结构体数组处理学生成绩、结构体类型函数求平均值
  11. linux环境安装的odac,net不安装Oracle11g客户端直接使用ODAC
  12. python另存为excel_python 将数据保存为excel的xls格式(实例讲解)
  13. linux命令查看文件读写,linux系统查看和修改文件读写命令
  14. 使用hosts屏蔽网站
  15. 服务器提交任务和直接运行,linux下任务提交以及如何后台运行任务
  16. 三、共阳数码管的静态显示
  17. 输入在第一行中给出一个正整数n(1)。第二行输入n个整数,用空格分开。在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
  18. 扇贝编程可以用c语言吗,扇贝编程手机版下载_扇贝编程app下载 v1.1.41 - 87G手游网...
  19. 图形化WiFi密码的破解
  20. [励志]知乎热门:做事情三分钟热度怎么破?

热门文章

  1. Spotlights
  2. HtmlHelper扩展 及 页面编码化
  3. 结对编程实现四则运算
  4. 手把手教你编写Logstash插件
  5. android136 360 拖拽
  6. js function随笔
  7. [恢]hdu 1421
  8. Clover支持目录多标签页
  9. c++语言中for循环语句,C++ 循环
  10. kafka发送mysql数据丢失_Kafka 如果丢了消息,怎么处理的?